library(tidyverse)
Registered S3 methods overwritten by 'dbplyr':
  method         from
  print.tbl_lazy     
  print.tbl_sql      
── Attaching packages ─────────────────────────────────────────────────────────────────────── tidyverse 1.3.2 ──✔ ggplot2 3.3.6      ✔ purrr   0.3.5 
✔ tibble  3.1.8      ✔ dplyr   1.0.10
✔ tidyr   1.2.1      ✔ stringr 1.4.1 
✔ readr   2.1.3      ✔ forcats 0.5.2 ── Conflicts ────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
#for general coding
library(janitor)

Attaching package: ‘janitor’

The following objects are masked from ‘package:stats’:

    chisq.test, fisher.test
#for cleaning
library(lubridate)

Attaching package: ‘lubridate’

The following objects are masked from ‘package:base’:

    date, intersect, setdiff, union
#for working with dates
library(readxl)
#for working with excel files
library(fuzzyjoin)
#for working with imperfect strings
library(reshape2)

Attaching package: ‘reshape2’

The following object is masked from ‘package:tidyr’:

    smiths

Uploading, Checking, & Cleaning

Uploading the scraped csv files, charges

These are files we scraped from the county clerk’s office with information on all codes we pulled for

#Misdemeanors
dwi_mis_raw <- read_csv("Data/scraped/bexar-misds-DWI-20191001-20191130.csv") %>%
  mutate(`OFFENSE-CODE` = as.character(`OFFENSE-CODE`)) %>%
  mutate(`CASE-CAUSE-NBR` = as.character(`CASE-CAUSE-NBR`)) %>%
  mutate(`ADDR-HOUSE-NBR` = as.character(`ADDR-HOUSE-NBR`)) %>%
  mutate(`SENTENCE` = as.character(`SENTENCE`)) %>%
  mutate(class = "misdemeanor")
New names:Warning: One or more parsing issues, call `problems()` on your data frame for details, e.g.:
  dat <- vroom(...)
  problems(dat)Rows: 78696 Columns: 68── Column specification ────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr  (51): FULL-NAME, ALIAS, SEX, RACE, BIRTHDATE, HOUSE-SUF, ADDR-PRE-DIRECTION, ADDR-STREET, ADDR-STREET-S...
dbl  (15): ...1, CASE-CAUSE-NBR, ADDR-HOUSE-NBR, ADDR-ZIP-CODE, OFFENSE-CODE, REDUCED-OFFENSE-CODE, COMPLAIN...
lgl   (1): Unnamed: 64
date  (1): offense_date_clean
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
#Felonies
dwi_fel_raw <- read_csv("Data/scraped/bexar-felony-DWI-20191001-20191130.csv") %>%
  mutate(`OFFENSE-CODE` = as.character(`OFFENSE-CODE`)) %>%
  mutate(`CASE-CAUSE-NBR` = as.character(`CASE-CAUSE-NBR`)) %>%
  mutate(`ADDR-HOUSE-NBR` = as.character(`ADDR-HOUSE-NBR`)) %>%
  mutate(`SENTENCE` = as.character(`SENTENCE`)) %>%
  mutate(class = "felony")
New names:Rows: 8593 Columns: 68── Column specification ────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr  (52): CASE-CAUSE-NBR, FULL-NAME, ALIAS, SEX, RACE, BIRTHDATE, ADDR-HOUSE-NBR, HOUSE-SUF, ADDR-PRE-DIREC...
dbl  (14): ...1, SID, JUDICIAL-NBR, ADDR-ZIP-CODE, OFFENSE-CODE, REDUCED-OFFENSE-CODE, COMPLAINT-DATE, DISPO...
lgl   (1): Unnamed: 64
date  (1): offense_date_clean
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
#Together
dwi_raw <- dwi_mis_raw %>%
  full_join(dwi_fel_raw)
Joining, by = c("...1", "CASE-CAUSE-NBR", "FULL-NAME", "ALIAS", "SEX", "RACE", "BIRTHDATE", "ADDR-HOUSE-NBR", "HOUSE-SUF", "ADDR-PRE-DIRECTION", "ADDR-STREET", "ADDR-STREET-SUFFIX", "ADDR-POST-DIRECTION", "ADDR-UNIT", "ADDR-CITY", "ADDR-STATE", "ADDR-ZIP-CODE", "ADDR-ZIP-PLUS-4", "OFFENSE-DATE", "OFFENSE-CODE", "OFFENSE-DESC", "OFFENSE-TYPE", "REDUCED-OFFENSE-CODE", "REDUCED-OFFENSE-DESC", "REDUCED-OFFENSE-TYPE", "LOCATION", "CUSTODY-DATE", "COMPLAINT-DATE", "FILING-AGENCY-DESCRIPTION", "CASE-DATE", "CASE-DESC", "SETTING-DATE", "SETTING-TYPE", "G-JURY-DATE", "G-JURY-STATUS", "DISPOSITION-DATE", "DISPOSITION-CODE", "DISPOSITION-DESC", "JUDGEMENT-DATE", "JUDGEMENT-CODE", "JUDGEMENT-DESC", "SENTENCE-DESC", "SENTENCE", "SENTENCE-START-DATE", "SENTENCE-END-DATE", "FINE-AMOUNT", "COURT-COSTS", "COURT-TYPE", "COURT", "POST-JUDICIAL-FIELD", "POST-JUDICIAL-DATE", "BOND-DATE", "BOND-STATUS", "BOND-AMOUNT", "BONDSMAN-NAME", "ATTORNEY", "ATTORNEY-BAR-NBR", "ATTORNEY-APPOINTED-RETAINED", "INTAKE-PROSECUTOR", "OUTTAKE-PROSECUTOR", "PROBATION-PROSECUTOR", "REVOKATION-PROSECUTOR", "ORIGINAL-SENTENCE", "SID", "JUDICIAL-NBR", "Unnamed: 64", "offense_desc_clean", "offense_date_clean", "class")
official_dwi_codes <- read_excel("Data/references_to_import/DWI-related offense codes from excel.xlsx", sheet = 1) %>%
  clean_names() %>%
  mutate(county_offense_code = as.character(county_offense_code))

Quick look at what we have

dwi_raw_codes <- dwi_raw %>%
  group_by(`OFFENSE-CODE`) %>%
  tally() %>%
  arrange(`OFFENSE-CODE`)

dwi_raw_codes
head(dwi_raw)
check_dwi <- official_dwi_codes %>%
  anti_join(dwi_raw, by = c("county_offense_code" = "OFFENSE-CODE"))

check_dwi

Cleaning the charges csv files

clean_dwi_anti <- dwi_raw %>%
  anti_join(official_dwi_codes, by = c("OFFENSE-CODE" = "county_offense_code")) %>%
  group_by(`OFFENSE-DESC`) %>%
  tally()

clean_dwi_anti
clean_dwi_pre <- dwi_raw %>%
  inner_join(official_dwi_codes, by = c("OFFENSE-CODE" = "county_offense_code")) %>%
  mutate("BIRTHDATE" = mdy(`BIRTHDATE`)) %>%
  mutate("OFFENSE-DATE" = mdy(`OFFENSE-DATE`)) %>%
  mutate("CUSTODY-DATE" = mdy(`CUSTODY-DATE`)) %>%
  mutate("COMPLAINT-DATE" = ymd(`COMPLAINT-DATE`)) %>%
  mutate("CASE-DATE" = mdy(`CASE-DATE`)) %>%
  mutate("SETTING-DATE" = mdy(`SETTING-DATE`)) %>%
  mutate("G-JURY-DATE" = mdy(`G-JURY-DATE`)) %>%
  mutate("DISPOSITION-DATE" = mdy(`DISPOSITION-DATE`)) %>%
  mutate("JUDGEMENT-DATE" = mdy(`JUDGEMENT-DATE`)) %>%
  mutate("SENTENCE-START-DATE" = mdy(`SENTENCE-START-DATE`)) %>%
  mutate("SENTENCE-END-DATE" = mdy(`SENTENCE-END-DATE`)) %>%
  mutate("POST-JUDICIAL-DATE" = mdy(`POST-JUDICIAL-DATE`)) %>%
  mutate("BOND-DATE" = mdy(`BOND-DATE`)) %>%
  mutate("original_sentence_years" = substr(`ORIGINAL-SENTENCE`, 1, 3)) %>%
  mutate("original_sentence_months" = substr(`ORIGINAL-SENTENCE`, 6, 7)) %>%
  mutate("original_sentence_days" = substr(`ORIGINAL-SENTENCE`, 11, 12)) %>%
  mutate("original_sentence_hours" = substr(`ORIGINAL-SENTENCE`, 16, 18)) %>%
  mutate("offense_date_clean" = ymd(`offense_date_clean`)) %>%
  mutate("FULL-NAME" = str_to_title(`FULL-NAME`)) %>%
  mutate("offense_year" = floor_date(`OFFENSE-DATE`, unit = "year")) %>%
  mutate("judgement_year" = floor_date(`JUDGEMENT-DATE`, unit = "year")) %>%
  ## May 10: adding this in so we can sort by DA
  mutate(da_in_power = case_when(
    judgement_year >= as.Date("2009-01-01") & judgement_year <= as.Date("2014-01-01") ~ "Susan Reed", 
    judgement_year >= as.Date("2015-01-01") & judgement_year <= as.Date("2018-01-01") ~ "Nico Lahood",
    judgement_year >= as.Date("2019-01-01") ~ "Joe Gonzales",
    is.na(judgement_year) & offense_year >= as.Date("2009-01-01") & offense_year <= as.Date("2014-01-01") ~ paste("Susan Reed BY OFFENSE YEAR", offense_year, sep = " "),
    is.na(judgement_year) & offense_year >= as.Date("2015-01-01") & offense_year <= as.Date("2018-01-01") ~ paste("Nico Lahood BY OFFENSE YEAR", offense_year, sep = " "),
    is.na(judgement_year) & offense_year >= as.Date("2019-01-01") ~ paste("Joe Gonzales BY OFFENSE YEAR", offense_year, sep = " "),
  )) %>%
  #select(-judgement_year) %>%
  clean_names() %>%
  select(-x1) %>%
  distinct()


clean_dwi_pre

EDIT NOV. 4, 2022

What are the judgement descriptions here

judge <- clean_dwi_pre %>%
  group_by(judgement_desc) %>%
  tally()

judge

This clean_dwi_pre file includes the “obstruction passageway” cases that are not alcohol-related. We will remove that in a later step

clean_dwi_offense_group <- clean_dwi_pre %>%
  group_by(offense_description, reduced_offense_desc) %>%
  tally() 
  #filter(grepl("OBSTRUCT", paste(offense_description, reduced_offense_desc)))

clean_dwi_offense_group
clean_dwi_offense_group_no_reduce <- clean_dwi_pre %>%
  group_by(offense_description) %>%
  tally() 
  #filter(grepl("OBSTRUCT", paste(offense_description, reduced_offense_desc)))

clean_dwi_offense_group_no_reduce

Brian always asks for the maximum date in our dataset so I need to remember that this is it:

max(clean_dwi_pre$offense_date)
min(clean_dwi_pre$offense_date)

Uploading the scraped csv files, case details

Case details are information we pulled from each person’s detailed case page

scraped_april_1 <- read_csv("Data/my_exports/April17/dwi.csv") %>%
  filter(eventDescription != "Timeout error")

## June 6th update -- some URLs weren't scraped so here's what we found. Still some people aren't on the site. 

scraped_april_2 <- read_csv("Data/scraped/ryan/fixedURLs.csv")

scraped_april_3 <- read_csv("Data/scraped/ryan/timeouts.csv")

scraped_april <- rbind(scraped_april_1, scraped_april_2, scraped_april_3)
check <- scraped_april %>%
  group_by(offense_description, reduced_offense_desc) %>%
  tally()

check

Cleaning the csv data: scraped files

Prep to eliminate not-alcohol obstruction passageway

Here, I’m making sure the data processes as I want it to be. Particularly – that dates are processed as dates

clean_scraped_prep <- scraped_april %>%
  #mutate(birthDate = mdy(birthDate)) %>%
  select(-birthDate) %>%
  mutate(eventDate = mdy(eventDate)) %>%
  mutate(case_cause_nbr = as.character(case_cause_nbr)) %>%
  filter(is.na(reduced_offense_desc) | reduced_offense_desc != "DRIVING WHILE INTOXICATED") %>%
  filter(is.na(reduced_offense_desc) | reduced_offense_desc != "DWI W/BAC 0.15 OR HIGHER") 
  
  #mutate(case_cause_nbr = if_else(case_cause_nbr == "0", "2019CR5617W", case_cause_nbr))


clean_scraped_prep

How many people are in this dataset?

clean_scraped_prep_ppl <- clean_scraped_prep %>%
  group_by(sid) %>%
  tally()

clean_scraped_prep_ppl

There are 19,714 rows, thus 19,714 people who have been charged with obstruction between Jan. 1, 2009 and Jan. 13, 2022

clean_scraped_prep_ppl_case <- clean_scraped_prep %>%
  group_by(case_cause_nbr) %>%
  tally()

clean_scraped_prep_ppl_case

There are 19,774 rows, thus 19,774 cases of obstruction between Jan. 1, 2009 and Jan. 13, 2022

This is a person who must be in here. Let’s double check their existence

hilario <- clean_scraped_prep %>%
  filter(sid == 1087579)

hilario

They exist

About the scraped (detailed case) data

Just to review:

full_name = the person’s name

url = the source where the data is from

birthDate = the person’s birthday — I think there is a small problem with this field and it got messed up after the scraping incident, but I’m not worried about it

sex = sex

race = race/ethnicity – it’s a weird column, not reliable, but gives a general idea of the individual’s race

offense_description = description of offense

reduced_offense_description = if applicable, the description of the reduced offense

court = court it was in

case_cause_nbr = case number

sid = a unique number for an individual

character_cnt = ignore, filed used to help me generate the url

eventDate = so we are pulling information from the table, located on the url. That table has all of the docket related events. This is the date of the docket-related event

eventDescription = so we are pulling information from the table, located on the url. That table has all of the docket related events. This is the description of the docket-related event

Data to look for

clean_scrape_prep = dataset that includes EVERY obstruction charge and the docket lines associated with the person and that charge clean_scrape = the work I do below to only look at DWI info in the obstruction charges

The Charges

And we are looking at obstruction-related charges. Here are those specific charges and the number of times they occur (column n)

count_charges <- clean_scraped_prep %>%
  select(sid, offense_description, reduced_offense_desc) %>%
  distinct() %>%
  group_by(offense_description, reduced_offense_desc) %>%
  tally()  %>%
  arrange(desc(n))

count_charges

Analysis

Scraped Case Information

General Analysis, all obstruction codes

Now I want to know how many people are in this dataset. The “n” column is the number of times they appear in my dataset of just “DWI-related” docket events. We can ignore that.

people_in_here <- clean_scraped %>%
  group_by(sid) %>%
  tally()

people_in_here

Answer: of the 19,714 who had an obstruction charge, about 19,444 had some sort of DWI indication. I know this because there are 19,444 rows

people_case_in_here <- clean_scraped %>%
  group_by(sid, case_cause_nbr) %>%
  #group_by(sid) %>%
  tally()

people_case_in_here

And of the 19,774 cases, 19,492 of them were related to drinking.

Passageway/Roadway Analysis

Now I want to look at people who only have this charge and see if they have alcohol-related stuff

So we go to the DWI docket event data, and say – give me only those with the passageway/roadway charge

Now let’s count the people

passageway <- clean_scraped %>%
  filter(grepl("OBSTRUCT PASSAGEWAY/ROADWAY", offense_description) | grepl("OBSTRUCT PASSAGEWAY/ROADWAY", reduced_offense_desc)) %>%
  filter(is.na(reduced_offense_desc) | reduced_offense_desc != "OBSTRUCT HIGHWAY-INTOXICATION") %>%
  arrange(sid)

passageway

Quick docket check for Allie

write_csv(passageway, "Data/my_exports/allie_check_passageway.csv")
passageway_check_docket <- passageway %>%
  group_by(eventDescription) %>%
  tally()

passageway_check_docket

Let me double check I’m looking at the charges I want to look at.

passageway_offense_desc <- passageway %>%
  select(sid, offense_description, reduced_offense_desc) %>%
  distinct() %>%
  group_by(offense_description, reduced_offense_desc) %>%
  tally()  %>%
  arrange(desc(n))

passageway_offense_desc

And now let’s count the people with the charge

passageway_ppl <- passageway %>%
  group_by(sid) %>%
  tally() 

passageway_ppl
NA

There are 3,562 people that have an indication of a DWI in the dataset.

passageway_case <- passageway %>%
  group_by(case_cause_nbr) %>%
  tally()  %>%
  arrange(-n)

passageway_case

There are 3,563 cases that have an indication of a DWI in the dataset with 3,562 people

But I know the main criteria we want to look for is a BAC above 0.15 or higher. So how many of these people had a BAC of 0.15 or higher?

All the BAC events:

pass_BAC_events <- passageway %>%
  filter(grepl(paste(bac_specific_official_dwi_events, collapse="|)"), eventDescription)) 

pass_BAC_events

All the BAC people:

people_pass_BAC <- pass_BAC_events %>%
  group_by(sid) %>%
  tally()

people_pass_BAC

There are 1,385 people with a BAC of 0.15 or higher.

case_pass_BAC <- pass_BAC_events %>%
  group_by(case_cause_nbr) %>%
  tally()

case_pass_BAC

There are 1,385 cases with a BAC of 0.15 or higher.

But you are probably wondering – well how many people had this passageway roadway charge?

Let’s look at the dataset before we filtered for DWI people

count_all_passageway <- clean_scraped_prep %>%
  filter(grepl("OBSTRUCT PASSAGEWAY/ROADWAY", offense_description) | grepl("OBSTRUCT PASSAGEWAY/ROADWAY", reduced_offense_desc)) %>%
  filter(is.na(reduced_offense_desc) | reduced_offense_desc != "OBSTRUCT HIGHWAY-INTOXICATION") %>%
  group_by(sid) %>%
  #group_by(sid, case_cause_nbr) %>%
  tally()
  
count_all_passageway

Final Finding: Of the 3,837 cases with obstruction of passageway charge between Jan. 1, 2009 and Jan. 13, 2022, 3,562 of them have been associated with a drinking above the legal limit. 1,385 people had a blood alcohol content above 0.15.

Highway Intox Obstruction

Okay, let’s look at people with the obstruction highway-intoxication charge.

First all of the docket events with this charge:

highway_intox <- clean_scraped %>%
  filter(grepl("OBSTRUCT HIGHWAY-INTOX", offense_description) | grepl("OBSTRUCT HIGHWAY-INTOX", reduced_offense_desc)) %>%
  filter(is.na(reduced_offense_desc) | reduced_offense_desc != "OBSTRUCT PASSAGEWAY/ROADWAY/WA")

highway_intox

Just to prove to myself that I am in fact looking at people with these only these charges, let’s double check:

highway_intox_offense_desc <- highway_intox %>%
  select(sid, offense_description, reduced_offense_desc) %>%
  distinct() %>%
  group_by(offense_description, reduced_offense_desc) %>%
  tally()  %>%
  arrange(desc(n))

highway_intox_offense_desc

Now the number of people with this charge

case_in_here_highway_intox <- highway_intox %>%
  group_by(case_cause_nbr) %>%
  #group_by(sid) %>%
  tally()

case_in_here_highway_intox
people_in_here_highway_intox <- highway_intox %>%
  group_by(sid) %>%
  tally()

people_in_here_highway_intox

So, there are 15,929 cases charged with (or had their charge reduced to) “OBSTRUCT HIGHWAY-INTOXICATION.” 15,891 people

But I know the main criteria we want to look for is a BAC above 0.15 or higher. So how many of these people had a BAC of 0.15 or higher?

All the BAC events:

highway_intox_BAC <- highway_intox %>%
  filter(grepl(paste(bac_specific_official_dwi_events, collapse="|)"), eventDescription)) 

highway_intox_BAC

All the BAC people:

case_highway_intox_BAC <- highway_intox_BAC %>%
  group_by(case_cause_nbr) %>%
  tally()

case_highway_intox_BAC

3,564 cases of BAC 0.15 in highway intoxication

people_highway_intox_BAC <- highway_intox_BAC %>%
  group_by(sid) %>%
  tally()

people_highway_intox_BAC

So there are 3,564 cases who had a BAC above 0.15 3,558 people

How many people in total had a highway intoxication charge?

count_all_highway_intox <- clean_scraped_prep %>%
  filter(grepl("OBSTRUCT HIGHWAY-INTOX", offense_description) | grepl("OBSTRUCT HIGHWAY-INTOX", reduced_offense_desc)) %>%
  filter(is.na(reduced_offense_desc) | reduced_offense_desc != "OBSTRUCT PASSAGEWAY/ROADWAY/WA") %>%
  group_by(case_cause_nbr) %>%
  tally()

  
count_all_highway_intox

Final Finding: Of the 15,929 cases with an obstruction highway intoxication charge between Jan. 1, 2009 and Jan. 13, 2022, 15,929 of them have been associated with a drinking above the legal limit. 3,564 of the cases had a docket line indicating that their BAC was above 0.15.

BAC master

bac_master <- clean_scraped %>%   
  filter(grepl(paste(bac_specific_official_dwi_events, collapse="|)"), eventDescription)) 


bac_ppl <- bac_master %>%
  group_by(sid, case_cause_nbr) %>%
  tally() %>%
  arrange(desc(n)) %>%
  group_by(sid) %>%
  tally() %>%
  arrange(desc(n))

bac_ppl
docket_976809 <- clean_scraped %>%
  filter(sid == 1099456)

docket_976809

1036672

DWI master

dwi_master <- clean_scraped %>%   
  filter(grepl(paste(official_dwi_events, collapse="|)"), eventDescription)) 


dwi_ppl <- dwi_master %>%
  group_by(sid, case_cause_nbr) %>%
  tally() %>%
  arrange(desc(n)) %>%
  group_by(sid) %>%
  tally() %>%
  arrange(desc(n))

dwi_ppl

Dated after Oct. 27, 2020

oct27 <- clean_scraped %>%
  filter(eventDate > as.Date("2020-10-27")) 
 

oct27
oct27_ppl <- oct27 %>%
 group_by(case_cause_nbr) %>%
  tally()

oct27_ppl

490 people

oct27_BAC_events <- oct27 %>%
  filter(grepl(paste(bac_specific_official_dwi_events, collapse="|)"), eventDescription)) 

oct27_BAC_events
oct27_BAC_ppl <- oct27_BAC_events %>%
 group_by(case_cause_nbr) %>%
  tally()

oct27_BAC_ppl

Answering Emilie’s Questions about DWI

She wants the following:

Codes to Pull: 540412 – Driving While Intoxicated -3D/M 540405 – Driving While Intoxicated 3rd 540418 – DWI w/ prev intox mansl convict 229999 – DWI Subsequent Offense 499999 – DWI – 3rd Accident 90901 – Intoxication Manslaughter 90902 – Intox Manslaughter Publ Serv

emilie_pull <- clean_individual_by_charges %>%
  filter(grepl("540412", paste(offense_description_offense_1.0, reduced_offense_desc_offense_1.0, offense_description_offense_1.1, reduced_offense_desc_offense_1.1,  offense_description_offense_1.2, reduced_offense_desc_offense_1.2, offense_description_offense_1.3, reduced_offense_desc_offense_1.3, offense_description_offense_1.4, reduced_offense_desc_offense_1.4, offense_description_offense_1.5, reduced_offense_desc_offense_1.5, offense_description_offense_2.0, reduced_offense_desc_offense_2.0, offense_description_offense_2.1, reduced_offense_desc_offense_2.1, offense_description_offense_2.2, reduced_offense_desc_offense_2.2, offense_description_offense_2.3, reduced_offense_desc_offense_2.3, offense_description_offense_3.0, reduced_offense_desc_offense_3.0, offense_description_offense_3.1, reduced_offense_desc_offense_3.1, offense_description_offense_3.2, reduced_offense_desc_offense_3.2, offense_description_offense_3.3, reduced_offense_desc_offense_3.3, offense_description_offense_3.4, reduced_offense_desc_offense_3.4,offense_description_offense_4.0, reduced_offense_desc_offense_4.0, offense_description_offense_4.1, reduced_offense_desc_offense_4.1,offense_description_offense_4.2, reduced_offense_desc_offense_4.2, offense_description_offense_5.0, reduced_offense_desc_offense_5.0, offense_description_offense_6.0, reduced_offense_desc_offense_6.0, offense_description_offense_7.0, reduced_offense_desc_offense_7.0)) 
         | grepl("540405", paste(offense_description_offense_1.0, reduced_offense_desc_offense_1.0, offense_description_offense_1.1, reduced_offense_desc_offense_1.1,  offense_description_offense_1.2, reduced_offense_desc_offense_1.2, offense_description_offense_1.3, reduced_offense_desc_offense_1.3, offense_description_offense_1.4, reduced_offense_desc_offense_1.4, offense_description_offense_1.5, reduced_offense_desc_offense_1.5, offense_description_offense_2.0, reduced_offense_desc_offense_2.0, offense_description_offense_2.1, reduced_offense_desc_offense_2.1, offense_description_offense_2.2, reduced_offense_desc_offense_2.2, offense_description_offense_2.3, reduced_offense_desc_offense_2.3, offense_description_offense_3.0, reduced_offense_desc_offense_3.0, offense_description_offense_3.1, reduced_offense_desc_offense_3.1, offense_description_offense_3.2, reduced_offense_desc_offense_3.2, offense_description_offense_3.3, reduced_offense_desc_offense_3.3, offense_description_offense_3.4, reduced_offense_desc_offense_3.4,offense_description_offense_4.0, reduced_offense_desc_offense_4.0, offense_description_offense_4.1, reduced_offense_desc_offense_4.1,offense_description_offense_4.2, reduced_offense_desc_offense_4.2, offense_description_offense_5.0, reduced_offense_desc_offense_5.0, offense_description_offense_6.0, reduced_offense_desc_offense_6.0, offense_description_offense_7.0, reduced_offense_desc_offense_7.0)) 
         | grepl("540418", paste(offense_description_offense_1.0, reduced_offense_desc_offense_1.0, offense_description_offense_1.1, reduced_offense_desc_offense_1.1,  offense_description_offense_1.2, reduced_offense_desc_offense_1.2, offense_description_offense_1.3, reduced_offense_desc_offense_1.3, offense_description_offense_1.4, reduced_offense_desc_offense_1.4, offense_description_offense_1.5, reduced_offense_desc_offense_1.5, offense_description_offense_2.0, reduced_offense_desc_offense_2.0, offense_description_offense_2.1, reduced_offense_desc_offense_2.1, offense_description_offense_2.2, reduced_offense_desc_offense_2.2, offense_description_offense_2.3, reduced_offense_desc_offense_2.3, offense_description_offense_3.0, reduced_offense_desc_offense_3.0, offense_description_offense_3.1, reduced_offense_desc_offense_3.1, offense_description_offense_3.2, reduced_offense_desc_offense_3.2, offense_description_offense_3.3, reduced_offense_desc_offense_3.3, offense_description_offense_3.4, reduced_offense_desc_offense_3.4,offense_description_offense_4.0, reduced_offense_desc_offense_4.0, offense_description_offense_4.1, reduced_offense_desc_offense_4.1,offense_description_offense_4.2, reduced_offense_desc_offense_4.2, offense_description_offense_5.0, reduced_offense_desc_offense_5.0, offense_description_offense_6.0, reduced_offense_desc_offense_6.0, offense_description_offense_7.0, reduced_offense_desc_offense_7.0)) 
         | grepl("229999", paste(offense_description_offense_1.0, reduced_offense_desc_offense_1.0, offense_description_offense_1.1, reduced_offense_desc_offense_1.1,  offense_description_offense_1.2, reduced_offense_desc_offense_1.2, offense_description_offense_1.3, reduced_offense_desc_offense_1.3, offense_description_offense_1.4, reduced_offense_desc_offense_1.4, offense_description_offense_1.5, reduced_offense_desc_offense_1.5, offense_description_offense_2.0, reduced_offense_desc_offense_2.0, offense_description_offense_2.1, reduced_offense_desc_offense_2.1, offense_description_offense_2.2, reduced_offense_desc_offense_2.2, offense_description_offense_2.3, reduced_offense_desc_offense_2.3, offense_description_offense_3.0, reduced_offense_desc_offense_3.0, offense_description_offense_3.1, reduced_offense_desc_offense_3.1, offense_description_offense_3.2, reduced_offense_desc_offense_3.2, offense_description_offense_3.3, reduced_offense_desc_offense_3.3, offense_description_offense_3.4, reduced_offense_desc_offense_3.4,offense_description_offense_4.0, reduced_offense_desc_offense_4.0, offense_description_offense_4.1, reduced_offense_desc_offense_4.1,offense_description_offense_4.2, reduced_offense_desc_offense_4.2, offense_description_offense_5.0, reduced_offense_desc_offense_5.0, offense_description_offense_6.0, reduced_offense_desc_offense_6.0, offense_description_offense_7.0, reduced_offense_desc_offense_7.0))
         | grepl("499999", paste(offense_description_offense_1.0, reduced_offense_desc_offense_1.0, offense_description_offense_1.1, reduced_offense_desc_offense_1.1,  offense_description_offense_1.2, reduced_offense_desc_offense_1.2, offense_description_offense_1.3, reduced_offense_desc_offense_1.3, offense_description_offense_1.4, reduced_offense_desc_offense_1.4, offense_description_offense_1.5, reduced_offense_desc_offense_1.5, offense_description_offense_2.0, reduced_offense_desc_offense_2.0, offense_description_offense_2.1, reduced_offense_desc_offense_2.1, offense_description_offense_2.2, reduced_offense_desc_offense_2.2, offense_description_offense_2.3, reduced_offense_desc_offense_2.3, offense_description_offense_3.0, reduced_offense_desc_offense_3.0, offense_description_offense_3.1, reduced_offense_desc_offense_3.1, offense_description_offense_3.2, reduced_offense_desc_offense_3.2, offense_description_offense_3.3, reduced_offense_desc_offense_3.3, offense_description_offense_3.4, reduced_offense_desc_offense_3.4,offense_description_offense_4.0, reduced_offense_desc_offense_4.0, offense_description_offense_4.1, reduced_offense_desc_offense_4.1,offense_description_offense_4.2, reduced_offense_desc_offense_4.2, offense_description_offense_5.0, reduced_offense_desc_offense_5.0, offense_description_offense_6.0, reduced_offense_desc_offense_6.0, offense_description_offense_7.0, reduced_offense_desc_offense_7.0)) 
         | grepl("90901", paste(offense_description_offense_1.0, reduced_offense_desc_offense_1.0, offense_description_offense_1.1, reduced_offense_desc_offense_1.1,  offense_description_offense_1.2, reduced_offense_desc_offense_1.2, offense_description_offense_1.3, reduced_offense_desc_offense_1.3, offense_description_offense_1.4, reduced_offense_desc_offense_1.4, offense_description_offense_1.5, reduced_offense_desc_offense_1.5, offense_description_offense_2.0, reduced_offense_desc_offense_2.0, offense_description_offense_2.1, reduced_offense_desc_offense_2.1, offense_description_offense_2.2, reduced_offense_desc_offense_2.2, offense_description_offense_2.3, reduced_offense_desc_offense_2.3, offense_description_offense_3.0, reduced_offense_desc_offense_3.0, offense_description_offense_3.1, reduced_offense_desc_offense_3.1, offense_description_offense_3.2, reduced_offense_desc_offense_3.2, offense_description_offense_3.3, reduced_offense_desc_offense_3.3, offense_description_offense_3.4, reduced_offense_desc_offense_3.4,offense_description_offense_4.0, reduced_offense_desc_offense_4.0, offense_description_offense_4.1, reduced_offense_desc_offense_4.1,offense_description_offense_4.2, reduced_offense_desc_offense_4.2, offense_description_offense_5.0, reduced_offense_desc_offense_5.0, offense_description_offense_6.0, reduced_offense_desc_offense_6.0, offense_description_offense_7.0, reduced_offense_desc_offense_7.0)) 
         | grepl("90902", paste(offense_description_offense_1.0, reduced_offense_desc_offense_1.0, offense_description_offense_1.1, reduced_offense_desc_offense_1.1,  offense_description_offense_1.2, reduced_offense_desc_offense_1.2, offense_description_offense_1.3, reduced_offense_desc_offense_1.3, offense_description_offense_1.4, reduced_offense_desc_offense_1.4, offense_description_offense_1.5, reduced_offense_desc_offense_1.5, offense_description_offense_2.0, reduced_offense_desc_offense_2.0, offense_description_offense_2.1, reduced_offense_desc_offense_2.1, offense_description_offense_2.2, reduced_offense_desc_offense_2.2, offense_description_offense_2.3, reduced_offense_desc_offense_2.3, offense_description_offense_3.0, reduced_offense_desc_offense_3.0, offense_description_offense_3.1, reduced_offense_desc_offense_3.1, offense_description_offense_3.2, reduced_offense_desc_offense_3.2, offense_description_offense_3.3, reduced_offense_desc_offense_3.3, offense_description_offense_3.4, reduced_offense_desc_offense_3.4,offense_description_offense_4.0, reduced_offense_desc_offense_4.0, offense_description_offense_4.1, reduced_offense_desc_offense_4.1,offense_description_offense_4.2, reduced_offense_desc_offense_4.2, offense_description_offense_5.0, reduced_offense_desc_offense_5.0, offense_description_offense_6.0, reduced_offense_desc_offense_6.0, offense_description_offense_7.0, reduced_offense_desc_offense_7.0)))  

emilie_pull
  

540412 – Driving While Intoxicated -3D/M 540405 – Driving While Intoxicated 3rd 540418 – DWI w/ prev intox mansl convict 229999 – DWI Subsequent Offense 499999 – DWI – 3rd Accident 90901 – Intoxication Manslaughter 90902 – Intox Manslaughter Publ Serv

emilie_pull_each_offense <- clean_dwi %>%
  filter(offense_code == "540412" | offense_code == "540405" | offense_code == "540418" | offense_code == "229999" | offense_code == "499999" | offense_code == "90901" | offense_code == "90902" | reduced_offense_code == "540412" | reduced_offense_code == "540405" | reduced_offense_code == "540418" | reduced_offense_code == "229999" | reduced_offense_code == "499999" | reduced_offense_code == "90901" |reduced_offense_code == "90902") %>%
  left_join(individual, by = "sid") %>%
  rename(number_of_dwi_related_offenses = n) %>%
  select(sid, full_name, sex, race, birthdate, number_of_dwi_related_offenses, everything())

emilie_pull_each_offense
#write_csv(emilie_pull, "my_exports/April17/emilie_pull.csv")
#write_csv(emilie_pull_each_offense, "Data/my_exports/May13/may11_emiliepull_by_offense.csv")
LS0tCnRpdGxlOiAiTWFzdGVyIEZpbGUiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKI2ZvciBnZW5lcmFsIGNvZGluZwpsaWJyYXJ5KGphbml0b3IpCiNmb3IgY2xlYW5pbmcKbGlicmFyeShsdWJyaWRhdGUpCiNmb3Igd29ya2luZyB3aXRoIGRhdGVzCmxpYnJhcnkocmVhZHhsKQojZm9yIHdvcmtpbmcgd2l0aCBleGNlbCBmaWxlcwpsaWJyYXJ5KGZ1enp5am9pbikKI2ZvciB3b3JraW5nIHdpdGggaW1wZXJmZWN0IHN0cmluZ3MKbGlicmFyeShyZXNoYXBlMikKYGBgCgojIFVwbG9hZGluZywgQ2hlY2tpbmcsICYgQ2xlYW5pbmcKCiMjIFVwbG9hZGluZyB0aGUgc2NyYXBlZCBjc3YgZmlsZXMsIGNoYXJnZXMKClRoZXNlIGFyZSBmaWxlcyB3ZSBzY3JhcGVkIGZyb20gdGhlIGNvdW50eSBjbGVyaydzIG9mZmljZSB3aXRoIGluZm9ybWF0aW9uIG9uIGFsbCBjb2RlcyB3ZSBwdWxsZWQgZm9yCgpgYGB7cn0KI01pc2RlbWVhbm9ycwpkd2lfbWlzX3JhdyA8LSByZWFkX2NzdigiRGF0YS9zY3JhcGVkL2JleGFyLW1pc2RzLURXSS0yMDE5MTAwMS0yMDE5MTEzMC5jc3YiKSAlPiUKICBtdXRhdGUoYE9GRkVOU0UtQ09ERWAgPSBhcy5jaGFyYWN0ZXIoYE9GRkVOU0UtQ09ERWApKSAlPiUKICBtdXRhdGUoYENBU0UtQ0FVU0UtTkJSYCA9IGFzLmNoYXJhY3RlcihgQ0FTRS1DQVVTRS1OQlJgKSkgJT4lCiAgbXV0YXRlKGBBRERSLUhPVVNFLU5CUmAgPSBhcy5jaGFyYWN0ZXIoYEFERFItSE9VU0UtTkJSYCkpICU+JQogIG11dGF0ZShgU0VOVEVOQ0VgID0gYXMuY2hhcmFjdGVyKGBTRU5URU5DRWApKSAlPiUKICBtdXRhdGUoY2xhc3MgPSAibWlzZGVtZWFub3IiKQoKI0ZlbG9uaWVzCmR3aV9mZWxfcmF3IDwtIHJlYWRfY3N2KCJEYXRhL3NjcmFwZWQvYmV4YXItZmVsb255LURXSS0yMDE5MTAwMS0yMDE5MTEzMC5jc3YiKSAlPiUKICBtdXRhdGUoYE9GRkVOU0UtQ09ERWAgPSBhcy5jaGFyYWN0ZXIoYE9GRkVOU0UtQ09ERWApKSAlPiUKICBtdXRhdGUoYENBU0UtQ0FVU0UtTkJSYCA9IGFzLmNoYXJhY3RlcihgQ0FTRS1DQVVTRS1OQlJgKSkgJT4lCiAgbXV0YXRlKGBBRERSLUhPVVNFLU5CUmAgPSBhcy5jaGFyYWN0ZXIoYEFERFItSE9VU0UtTkJSYCkpICU+JQogIG11dGF0ZShgU0VOVEVOQ0VgID0gYXMuY2hhcmFjdGVyKGBTRU5URU5DRWApKSAlPiUKICBtdXRhdGUoY2xhc3MgPSAiZmVsb255IikKCiNUb2dldGhlcgpkd2lfcmF3IDwtIGR3aV9taXNfcmF3ICU+JQogIGZ1bGxfam9pbihkd2lfZmVsX3JhdykKCm9mZmljaWFsX2R3aV9jb2RlcyA8LSByZWFkX2V4Y2VsKCJEYXRhL3JlZmVyZW5jZXNfdG9faW1wb3J0L0RXSS1yZWxhdGVkIG9mZmVuc2UgY29kZXMgZnJvbSBleGNlbC54bHN4Iiwgc2hlZXQgPSAxKSAlPiUKICBjbGVhbl9uYW1lcygpICU+JQogIG11dGF0ZShjb3VudHlfb2ZmZW5zZV9jb2RlID0gYXMuY2hhcmFjdGVyKGNvdW50eV9vZmZlbnNlX2NvZGUpKQpgYGAKClF1aWNrIGxvb2sgYXQgd2hhdCB3ZSBoYXZlCgpgYGB7cn0KZHdpX3Jhd19jb2RlcyA8LSBkd2lfcmF3ICU+JQogIGdyb3VwX2J5KGBPRkZFTlNFLUNPREVgKSAlPiUKICB0YWxseSgpICU+JQogIGFycmFuZ2UoYE9GRkVOU0UtQ09ERWApCgpkd2lfcmF3X2NvZGVzCmBgYAoKYGBge3J9CmhlYWQoZHdpX3JhdykKYGBgCgpgYGB7cn0KY2hlY2tfZHdpIDwtIG9mZmljaWFsX2R3aV9jb2RlcyAlPiUKICBhbnRpX2pvaW4oZHdpX3JhdywgYnkgPSBjKCJjb3VudHlfb2ZmZW5zZV9jb2RlIiA9ICJPRkZFTlNFLUNPREUiKSkKCmNoZWNrX2R3aQpgYGAKCiMjIENsZWFuaW5nIHRoZSBjaGFyZ2VzIGNzdiBmaWxlcwoKYGBge3J9CmNsZWFuX2R3aV9hbnRpIDwtIGR3aV9yYXcgJT4lCiAgYW50aV9qb2luKG9mZmljaWFsX2R3aV9jb2RlcywgYnkgPSBjKCJPRkZFTlNFLUNPREUiID0gImNvdW50eV9vZmZlbnNlX2NvZGUiKSkgJT4lCiAgZ3JvdXBfYnkoYE9GRkVOU0UtREVTQ2ApICU+JQogIHRhbGx5KCkKCmNsZWFuX2R3aV9hbnRpCmBgYAoKCmBgYHtyfQpjbGVhbl9kd2lfcHJlIDwtIGR3aV9yYXcgJT4lCiAgaW5uZXJfam9pbihvZmZpY2lhbF9kd2lfY29kZXMsIGJ5ID0gYygiT0ZGRU5TRS1DT0RFIiA9ICJjb3VudHlfb2ZmZW5zZV9jb2RlIikpICU+JQogIG11dGF0ZSgiQklSVEhEQVRFIiA9IG1keShgQklSVEhEQVRFYCkpICU+JQogIG11dGF0ZSgiT0ZGRU5TRS1EQVRFIiA9IG1keShgT0ZGRU5TRS1EQVRFYCkpICU+JQogIG11dGF0ZSgiQ1VTVE9EWS1EQVRFIiA9IG1keShgQ1VTVE9EWS1EQVRFYCkpICU+JQogIG11dGF0ZSgiQ09NUExBSU5ULURBVEUiID0geW1kKGBDT01QTEFJTlQtREFURWApKSAlPiUKICBtdXRhdGUoIkNBU0UtREFURSIgPSBtZHkoYENBU0UtREFURWApKSAlPiUKICBtdXRhdGUoIlNFVFRJTkctREFURSIgPSBtZHkoYFNFVFRJTkctREFURWApKSAlPiUKICBtdXRhdGUoIkctSlVSWS1EQVRFIiA9IG1keShgRy1KVVJZLURBVEVgKSkgJT4lCiAgbXV0YXRlKCJESVNQT1NJVElPTi1EQVRFIiA9IG1keShgRElTUE9TSVRJT04tREFURWApKSAlPiUKICBtdXRhdGUoIkpVREdFTUVOVC1EQVRFIiA9IG1keShgSlVER0VNRU5ULURBVEVgKSkgJT4lCiAgbXV0YXRlKCJTRU5URU5DRS1TVEFSVC1EQVRFIiA9IG1keShgU0VOVEVOQ0UtU1RBUlQtREFURWApKSAlPiUKICBtdXRhdGUoIlNFTlRFTkNFLUVORC1EQVRFIiA9IG1keShgU0VOVEVOQ0UtRU5ELURBVEVgKSkgJT4lCiAgbXV0YXRlKCJQT1NULUpVRElDSUFMLURBVEUiID0gbWR5KGBQT1NULUpVRElDSUFMLURBVEVgKSkgJT4lCiAgbXV0YXRlKCJCT05ELURBVEUiID0gbWR5KGBCT05ELURBVEVgKSkgJT4lCiAgbXV0YXRlKCJvcmlnaW5hbF9zZW50ZW5jZV95ZWFycyIgPSBzdWJzdHIoYE9SSUdJTkFMLVNFTlRFTkNFYCwgMSwgMykpICU+JQogIG11dGF0ZSgib3JpZ2luYWxfc2VudGVuY2VfbW9udGhzIiA9IHN1YnN0cihgT1JJR0lOQUwtU0VOVEVOQ0VgLCA2LCA3KSkgJT4lCiAgbXV0YXRlKCJvcmlnaW5hbF9zZW50ZW5jZV9kYXlzIiA9IHN1YnN0cihgT1JJR0lOQUwtU0VOVEVOQ0VgLCAxMSwgMTIpKSAlPiUKICBtdXRhdGUoIm9yaWdpbmFsX3NlbnRlbmNlX2hvdXJzIiA9IHN1YnN0cihgT1JJR0lOQUwtU0VOVEVOQ0VgLCAxNiwgMTgpKSAlPiUKICBtdXRhdGUoIm9mZmVuc2VfZGF0ZV9jbGVhbiIgPSB5bWQoYG9mZmVuc2VfZGF0ZV9jbGVhbmApKSAlPiUKICBtdXRhdGUoIkZVTEwtTkFNRSIgPSBzdHJfdG9fdGl0bGUoYEZVTEwtTkFNRWApKSAlPiUKICBtdXRhdGUoIm9mZmVuc2VfeWVhciIgPSBmbG9vcl9kYXRlKGBPRkZFTlNFLURBVEVgLCB1bml0ID0gInllYXIiKSkgJT4lCiAgbXV0YXRlKCJqdWRnZW1lbnRfeWVhciIgPSBmbG9vcl9kYXRlKGBKVURHRU1FTlQtREFURWAsIHVuaXQgPSAieWVhciIpKSAlPiUKICAjIyBNYXkgMTA6IGFkZGluZyB0aGlzIGluIHNvIHdlIGNhbiBzb3J0IGJ5IERBCiAgbXV0YXRlKGRhX2luX3Bvd2VyID0gY2FzZV93aGVuKAogICAganVkZ2VtZW50X3llYXIgPj0gYXMuRGF0ZSgiMjAwOS0wMS0wMSIpICYganVkZ2VtZW50X3llYXIgPD0gYXMuRGF0ZSgiMjAxNC0wMS0wMSIpIH4gIlN1c2FuIFJlZWQiLCAKICAgIGp1ZGdlbWVudF95ZWFyID49IGFzLkRhdGUoIjIwMTUtMDEtMDEiKSAmIGp1ZGdlbWVudF95ZWFyIDw9IGFzLkRhdGUoIjIwMTgtMDEtMDEiKSB+ICJOaWNvIExhaG9vZCIsCiAgICBqdWRnZW1lbnRfeWVhciA+PSBhcy5EYXRlKCIyMDE5LTAxLTAxIikgfiAiSm9lIEdvbnphbGVzIiwKICAgIGlzLm5hKGp1ZGdlbWVudF95ZWFyKSAmIG9mZmVuc2VfeWVhciA+PSBhcy5EYXRlKCIyMDA5LTAxLTAxIikgJiBvZmZlbnNlX3llYXIgPD0gYXMuRGF0ZSgiMjAxNC0wMS0wMSIpIH4gcGFzdGUoIlN1c2FuIFJlZWQgQlkgT0ZGRU5TRSBZRUFSIiwgb2ZmZW5zZV95ZWFyLCBzZXAgPSAiICIpLAogICAgaXMubmEoanVkZ2VtZW50X3llYXIpICYgb2ZmZW5zZV95ZWFyID49IGFzLkRhdGUoIjIwMTUtMDEtMDEiKSAmIG9mZmVuc2VfeWVhciA8PSBhcy5EYXRlKCIyMDE4LTAxLTAxIikgfiBwYXN0ZSgiTmljbyBMYWhvb2QgQlkgT0ZGRU5TRSBZRUFSIiwgb2ZmZW5zZV95ZWFyLCBzZXAgPSAiICIpLAogICAgaXMubmEoanVkZ2VtZW50X3llYXIpICYgb2ZmZW5zZV95ZWFyID49IGFzLkRhdGUoIjIwMTktMDEtMDEiKSB+IHBhc3RlKCJKb2UgR29uemFsZXMgQlkgT0ZGRU5TRSBZRUFSIiwgb2ZmZW5zZV95ZWFyLCBzZXAgPSAiICIpLAogICkpICU+JQogICNzZWxlY3QoLWp1ZGdlbWVudF95ZWFyKSAlPiUKICBjbGVhbl9uYW1lcygpICU+JQogIHNlbGVjdCgteDEpICU+JQogIGRpc3RpbmN0KCkKCgpjbGVhbl9kd2lfcHJlCmBgYApFRElUIE5PVi4gNCwgMjAyMgoKV2hhdCBhcmUgdGhlIGp1ZGdlbWVudCBkZXNjcmlwdGlvbnMgaGVyZQoKYGBge3J9Cmp1ZGdlIDwtIGNsZWFuX2R3aV9wcmUgJT4lCiAgZ3JvdXBfYnkoanVkZ2VtZW50X2Rlc2MpICU+JQogIHRhbGx5KCkKCmp1ZGdlCmBgYAoKClRoaXMgY2xlYW5fZHdpX3ByZSBmaWxlIGluY2x1ZGVzIHRoZSAib2JzdHJ1Y3Rpb24gcGFzc2FnZXdheSIgY2FzZXMgdGhhdCBhcmUgbm90IGFsY29ob2wtcmVsYXRlZC4gV2Ugd2lsbCByZW1vdmUgdGhhdCBpbiBhIGxhdGVyIHN0ZXAKCmBgYHtyfQpjbGVhbl9kd2lfb2ZmZW5zZV9ncm91cCA8LSBjbGVhbl9kd2lfcHJlICU+JQogIGdyb3VwX2J5KG9mZmVuc2VfZGVzY3JpcHRpb24sIHJlZHVjZWRfb2ZmZW5zZV9kZXNjKSAlPiUKICB0YWxseSgpIAogICNmaWx0ZXIoZ3JlcGwoIk9CU1RSVUNUIiwgcGFzdGUob2ZmZW5zZV9kZXNjcmlwdGlvbiwgcmVkdWNlZF9vZmZlbnNlX2Rlc2MpKSkKCmNsZWFuX2R3aV9vZmZlbnNlX2dyb3VwCmBgYAoKYGBge3J9CmNsZWFuX2R3aV9vZmZlbnNlX2dyb3VwX25vX3JlZHVjZSA8LSBjbGVhbl9kd2lfcHJlICU+JQogIGdyb3VwX2J5KG9mZmVuc2VfZGVzY3JpcHRpb24pICU+JQogIHRhbGx5KCkgCiAgI2ZpbHRlcihncmVwbCgiT0JTVFJVQ1QiLCBwYXN0ZShvZmZlbnNlX2Rlc2NyaXB0aW9uLCByZWR1Y2VkX29mZmVuc2VfZGVzYykpKQoKY2xlYW5fZHdpX29mZmVuc2VfZ3JvdXBfbm9fcmVkdWNlCmBgYAoKQnJpYW4gYWx3YXlzIGFza3MgZm9yIHRoZSBtYXhpbXVtIGRhdGUgaW4gb3VyIGRhdGFzZXQgc28gSSBuZWVkIHRvIHJlbWVtYmVyIHRoYXQgdGhpcyBpcyBpdDoKCmBgYHtyfQptYXgoY2xlYW5fZHdpX3ByZSRvZmZlbnNlX2RhdGUpCmBgYAoKYGBge3J9Cm1pbihjbGVhbl9kd2lfcHJlJG9mZmVuc2VfZGF0ZSkKYGBgCgoKCgojIyBVcGxvYWRpbmcgdGhlIHNjcmFwZWQgY3N2IGZpbGVzLCBjYXNlIGRldGFpbHMKCkNhc2UgZGV0YWlscyBhcmUgaW5mb3JtYXRpb24gd2UgcHVsbGVkIGZyb20gZWFjaCBwZXJzb24ncyBkZXRhaWxlZCBjYXNlIHBhZ2UKCmBgYHtyfQpzY3JhcGVkX2FwcmlsXzEgPC0gcmVhZF9jc3YoIkRhdGEvbXlfZXhwb3J0cy9BcHJpbDE3L2R3aS5jc3YiKSAlPiUKICBmaWx0ZXIoZXZlbnREZXNjcmlwdGlvbiAhPSAiVGltZW91dCBlcnJvciIpCgojIyBKdW5lIDZ0aCB1cGRhdGUgLS0gc29tZSBVUkxzIHdlcmVuJ3Qgc2NyYXBlZCBzbyBoZXJlJ3Mgd2hhdCB3ZSBmb3VuZC4gU3RpbGwgc29tZSBwZW9wbGUgYXJlbid0IG9uIHRoZSBzaXRlLiAKCnNjcmFwZWRfYXByaWxfMiA8LSByZWFkX2NzdigiRGF0YS9zY3JhcGVkL3J5YW4vZml4ZWRVUkxzLmNzdiIpCgpzY3JhcGVkX2FwcmlsXzMgPC0gcmVhZF9jc3YoIkRhdGEvc2NyYXBlZC9yeWFuL3RpbWVvdXRzLmNzdiIpCgpzY3JhcGVkX2FwcmlsIDwtIHJiaW5kKHNjcmFwZWRfYXByaWxfMSwgc2NyYXBlZF9hcHJpbF8yLCBzY3JhcGVkX2FwcmlsXzMpCmBgYAoKYGBge3J9CmNoZWNrIDwtIHNjcmFwZWRfYXByaWwgJT4lCiAgZ3JvdXBfYnkob2ZmZW5zZV9kZXNjcmlwdGlvbiwgcmVkdWNlZF9vZmZlbnNlX2Rlc2MpICU+JQogIHRhbGx5KCkKCmNoZWNrCmBgYAoKIyMgQ2xlYW5pbmcgdGhlIGNzdiBkYXRhOiBzY3JhcGVkIGZpbGVzCgojIyMgUHJlcCB0byBlbGltaW5hdGUgbm90LWFsY29ob2wgb2JzdHJ1Y3Rpb24gcGFzc2FnZXdheQoKSGVyZSwgSSdtIG1ha2luZyBzdXJlIHRoZSBkYXRhIHByb2Nlc3NlcyBhcyBJIHdhbnQgaXQgdG8gYmUuIFBhcnRpY3VsYXJseSAtLSB0aGF0IGRhdGVzIGFyZSBwcm9jZXNzZWQgYXMgZGF0ZXMKCmBgYHtyfQpjbGVhbl9zY3JhcGVkX3ByZXAgPC0gc2NyYXBlZF9hcHJpbCAlPiUKICAjbXV0YXRlKGJpcnRoRGF0ZSA9IG1keShiaXJ0aERhdGUpKSAlPiUKICBzZWxlY3QoLWJpcnRoRGF0ZSkgJT4lCiAgbXV0YXRlKGV2ZW50RGF0ZSA9IG1keShldmVudERhdGUpKSAlPiUKICBtdXRhdGUoY2FzZV9jYXVzZV9uYnIgPSBhcy5jaGFyYWN0ZXIoY2FzZV9jYXVzZV9uYnIpKSAlPiUKICBmaWx0ZXIoaXMubmEocmVkdWNlZF9vZmZlbnNlX2Rlc2MpIHwgcmVkdWNlZF9vZmZlbnNlX2Rlc2MgIT0gIkRSSVZJTkcgV0hJTEUgSU5UT1hJQ0FURUQiKSAlPiUKICBmaWx0ZXIoaXMubmEocmVkdWNlZF9vZmZlbnNlX2Rlc2MpIHwgcmVkdWNlZF9vZmZlbnNlX2Rlc2MgIT0gIkRXSSBXL0JBQyAwLjE1IE9SIEhJR0hFUiIpIAogIAogICNtdXRhdGUoY2FzZV9jYXVzZV9uYnIgPSBpZl9lbHNlKGNhc2VfY2F1c2VfbmJyID09ICIwIiwgIjIwMTlDUjU2MTdXIiwgY2FzZV9jYXVzZV9uYnIpKQoKCmNsZWFuX3NjcmFwZWRfcHJlcApgYGAKCkhvdyBtYW55IHBlb3BsZSBhcmUgaW4gdGhpcyBkYXRhc2V0PwoKYGBge3J9CmNsZWFuX3NjcmFwZWRfcHJlcF9wcGwgPC0gY2xlYW5fc2NyYXBlZF9wcmVwICU+JQogIGdyb3VwX2J5KHNpZCkgJT4lCiAgdGFsbHkoKQoKY2xlYW5fc2NyYXBlZF9wcmVwX3BwbApgYGAKVGhlcmUgYXJlIDE5LDcxNCByb3dzLCB0aHVzIDE5LDcxNCBwZW9wbGUgd2hvIGhhdmUgYmVlbiBjaGFyZ2VkIHdpdGggb2JzdHJ1Y3Rpb24gYmV0d2VlbiBKYW4uIDEsIDIwMDkgYW5kIEphbi4gMTMsIDIwMjIKCmBgYHtyfQpjbGVhbl9zY3JhcGVkX3ByZXBfcHBsX2Nhc2UgPC0gY2xlYW5fc2NyYXBlZF9wcmVwICU+JQogIGdyb3VwX2J5KGNhc2VfY2F1c2VfbmJyKSAlPiUKICB0YWxseSgpCgpjbGVhbl9zY3JhcGVkX3ByZXBfcHBsX2Nhc2UKYGBgCgpUaGVyZSBhcmUgMTksNzc0IHJvd3MsIHRodXMgMTksNzc0IGNhc2VzIG9mIG9ic3RydWN0aW9uIGJldHdlZW4gSmFuLiAxLCAyMDA5IGFuZCBKYW4uIDEzLCAyMDIyIAoKVGhpcyBpcyBhIHBlcnNvbiB3aG8gbXVzdCBiZSBpbiBoZXJlLiBMZXQncyBkb3VibGUgY2hlY2sgdGhlaXIgZXhpc3RlbmNlCgpgYGB7cn0KaGlsYXJpbyA8LSBjbGVhbl9zY3JhcGVkX3ByZXAgJT4lCiAgZmlsdGVyKHNpZCA9PSAxMDg3NTc5KQoKaGlsYXJpbwpgYGAKClRoZXkgZXhpc3QKCiMjIyBBYm91dCB0aGUgc2NyYXBlZCAoZGV0YWlsZWQgY2FzZSkgZGF0YQoKKipKdXN0IHRvIHJldmlldyoqOgoKZnVsbF9uYW1lID0gdGhlIHBlcnNvbidzIG5hbWUKCnVybCA9IHRoZSBzb3VyY2Ugd2hlcmUgdGhlIGRhdGEgaXMgZnJvbQoKYmlydGhEYXRlID0gdGhlIHBlcnNvbidzIGJpcnRoZGF5IC0tLSBJIHRoaW5rIHRoZXJlIGlzIGEgc21hbGwgcHJvYmxlbSB3aXRoIHRoaXMgZmllbGQgYW5kIGl0IGdvdCBtZXNzZWQgdXAgYWZ0ZXIgdGhlIHNjcmFwaW5nIGluY2lkZW50LCBidXQgSSdtIG5vdCB3b3JyaWVkIGFib3V0IGl0CgpzZXggPSBzZXgKCnJhY2UgPSByYWNlL2V0aG5pY2l0eSAtLSBpdCdzIGEgd2VpcmQgY29sdW1uLCBub3QgcmVsaWFibGUsIGJ1dCBnaXZlcyBhIGdlbmVyYWwgaWRlYSBvZiB0aGUgaW5kaXZpZHVhbCdzIHJhY2UKCm9mZmVuc2VfZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbiBvZiBvZmZlbnNlCgpyZWR1Y2VkX29mZmVuc2VfZGVzY3JpcHRpb24gPSBpZiBhcHBsaWNhYmxlLCB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHJlZHVjZWQgb2ZmZW5zZQoKY291cnQgPSBjb3VydCBpdCB3YXMgaW4KCmNhc2VfY2F1c2VfbmJyID0gY2FzZSBudW1iZXIKCnNpZCA9IGEgdW5pcXVlIG51bWJlciBmb3IgYW4gaW5kaXZpZHVhbAoKY2hhcmFjdGVyX2NudCA9IGlnbm9yZSwgZmlsZWQgdXNlZCB0byBoZWxwIG1lIGdlbmVyYXRlIHRoZSB1cmwKCmV2ZW50RGF0ZSA9IHNvIHdlIGFyZSBwdWxsaW5nIGluZm9ybWF0aW9uIGZyb20gdGhlIHRhYmxlLCBsb2NhdGVkIG9uIHRoZSB1cmwuIFRoYXQgdGFibGUgaGFzIGFsbCBvZiB0aGUgZG9ja2V0IHJlbGF0ZWQgZXZlbnRzLiBUaGlzIGlzIHRoZSBkYXRlIG9mIHRoZSBkb2NrZXQtcmVsYXRlZCBldmVudAoKZXZlbnREZXNjcmlwdGlvbiA9IHNvIHdlIGFyZSBwdWxsaW5nIGluZm9ybWF0aW9uIGZyb20gdGhlIHRhYmxlLCBsb2NhdGVkIG9uIHRoZSB1cmwuIFRoYXQgdGFibGUgaGFzIGFsbCBvZiB0aGUgZG9ja2V0IHJlbGF0ZWQgZXZlbnRzLiBUaGlzIGlzIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZG9ja2V0LXJlbGF0ZWQgZXZlbnQKCioqRGF0YSB0byBsb29rIGZvcioqCgpjbGVhbl9zY3JhcGVfcHJlcCA9IGRhdGFzZXQgdGhhdCBpbmNsdWRlcyBFVkVSWSBvYnN0cnVjdGlvbiBjaGFyZ2UgYW5kIHRoZSBkb2NrZXQgbGluZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwZXJzb24gYW5kIHRoYXQgY2hhcmdlIGNsZWFuX3NjcmFwZSA9IHRoZSB3b3JrIEkgZG8gYmVsb3cgdG8gb25seSBsb29rIGF0IERXSSBpbmZvIGluIHRoZSBvYnN0cnVjdGlvbiBjaGFyZ2VzCgoqKlRoZSBDaGFyZ2VzKioKCkFuZCB3ZSBhcmUgbG9va2luZyBhdCBvYnN0cnVjdGlvbi1yZWxhdGVkIGNoYXJnZXMuIEhlcmUgYXJlIHRob3NlIHNwZWNpZmljIGNoYXJnZXMgYW5kIHRoZSBudW1iZXIgb2YgdGltZXMgdGhleSBvY2N1ciAoY29sdW1uIG4pCgpgYGB7cn0KY291bnRfY2hhcmdlcyA8LSBjbGVhbl9zY3JhcGVkX3ByZXAgJT4lCiAgc2VsZWN0KHNpZCwgb2ZmZW5zZV9kZXNjcmlwdGlvbiwgcmVkdWNlZF9vZmZlbnNlX2Rlc2MpICU+JQogIGRpc3RpbmN0KCkgJT4lCiAgZ3JvdXBfYnkob2ZmZW5zZV9kZXNjcmlwdGlvbiwgcmVkdWNlZF9vZmZlbnNlX2Rlc2MpICU+JQogIHRhbGx5KCkgICU+JQogIGFycmFuZ2UoZGVzYyhuKSkKCmNvdW50X2NoYXJnZXMKYGBgCgojIERlZmluaW5nIGFsY29ob2wtcmVsYXRlZCBjYXNlcwoKIyMgTG9va2luZyBmb3IgRFdJIGV2ZW50cwoKTm93IC0tIEkgbmVlZCB0byBmaWd1cmUgb3V0IHdoYXQgZXZlbnRzIGFyZSB0aGUgYmVzdCB0byBsb29rIGF0IGJlY2F1c2Ugd2UgY2FyZSBhYm91dCBob3cgbWFueSBvZiB0aGVzZSBwZW9wbGUgaGF2ZSBhIERXSS1yZWxhdGVkIGRvY2tldCBldmVudCBTbyB0aGlzIGlzIHdoZXJlIEkgZG8gYSBrZXkgd29yZCBzZWFyY2guIEJhc2ljYWxseSwgZ2l2ZSBtZSAiRFdJIiwgIkJBQyIsICJCQSBDIDAuMTUiLCAiRFJJVklORyBXSElMRSBJTlRPWElDQVRFRCIgQlVUIGRvbid0IGdpdmUgbWUgIkJBQ0siLCAiQkFDSCIsICJOTyBBTENPSE9MIiwgb3IgIldVUlpCQUMiIChJIGtub3cgdG8gZmlsdGVyIHRoZXNlIG91dCB0aHJvdWdoIHRyaWFsIGFuZCBlcnJvcikKCmBgYHtyfQpkd2lfZXZlbnRzIDwtIGNsZWFuX3NjcmFwZWRfcHJlcCAlPiUKICBmaWx0ZXIoZ3JlcGwoIkRXSSIsIGV2ZW50RGVzY3JpcHRpb24pIHwgZ3JlcGwoIkJBQyIsIGV2ZW50RGVzY3JpcHRpb24pIHwgZ3JlcGwoIkJBIEMgMC4xNSIsIGV2ZW50RGVzY3JpcHRpb24pIHwgZ3JlcGwoIkRSSVZJTkcgV0hJTEUgSU5UT1hJQ0FURUQiLCBldmVudERlc2NyaXB0aW9uKSkgJT4lCiAgZmlsdGVyKCFncmVwbCgiQkFDSyIsIGV2ZW50RGVzY3JpcHRpb24pICYgIWdyZXBsKCJCQUNIIiwgZXZlbnREZXNjcmlwdGlvbikgJiAhZ3JlcGwoIk5PIEFMQ09IT0wiLCBldmVudERlc2NyaXB0aW9uKSAmICFncmVwbCgiV1VSWkJBQyIsIGV2ZW50RGVzY3JpcHRpb24pKSAlPiUKICBncm91cF9ieShldmVudERlc2NyaXB0aW9uKSAlPiUKICB0YWxseSgpICU+JQogIGFycmFuZ2UoZGVzYyhuKSkKCmR3aV9ldmVudHMKYGBgCgpJIGxvb2tlZCB0aHJvdWdoIHRoaXMsIGFuZCBJIGJlbGlldmUgdGhlc2UgYXJlIHRoZSBjaGFyZ2VzIHdlIHdhbnQgaGVyZSBhcyBkZWZpbmVkIGluIHRoZSB2YXJpYWJsZXM6IAoKYGBge3J9Cm9mZmljaWFsX2R3aV9ldmVudHMgPC0gYygiTUIgNTQwNDA5IERSSVZJTkcgV0hJTEUgSU5UT1hJQ0FURUQiLCAiQkEgQyAwLjE1IE9SIEhJR0hFUiIsICJNQSA1NDA0MTEgRFJJVklORyBXSElMRSBJTlRPWElDQVRFRC0yRCIsICJCQUMgMC4xNSBPUiBISUdIRVIiLCAiTUEgNTQwNDAzIERSSVZJTkcgV0hJTEUgSU5UT1hJQ0FURUQgMVMiLCAiNTQwNDA5IERSSVZJTkcgV0hJTEUgSU5UT1hJQ0FURUQiLCI1NDA0MDkgRFJJVklORyBXSElMRSBJTlRPWElDQVRFRCIsICJGMyA1NDA0MTIgRFJJVklORyBXSElMRSBJTlRPWElDQVRFRC0zRCIsICJGMyA1NDA0MTMgSU5UT1hJQ0EgVElPTiBBU1NBVUxUIiwgIkRSSVZJTkcgV0hJTEUgSU5UT1hJQ0FURUQiLCAiNTQwNDE2IiwgIjUzMDcyMSIsICI1NDA0MTQiLCAiNTQwNDE1IiwgIjU0MDQxMCIpCgpiYWNfc3BlY2lmaWNfb2ZmaWNpYWxfZHdpX2V2ZW50cyA8LSBjKCJCQSBDIDAuMTUgT1IgSElHSEVSIiwgIkJBQyAwLjE1IE9SIEhJR0hFUiIpCmBgYAoKTm93LCBJIGFtIGxvb2tpbmcgZm9yIHRob3NlIHNwZWNpZmljIGRvY2tldCBldmVudHMgaW4gb3VyIHNjcmFwZWQgZGF0YQoKYGBge3J9CmNsZWFuX3NjcmFwZWQgPC0gY2xlYW5fc2NyYXBlZF9wcmVwICU+JQogIGZpbHRlcihncmVwbChwYXN0ZShvZmZpY2lhbF9kd2lfZXZlbnRzLCBjb2xsYXBzZT0gInwiKSwgZXZlbnREZXNjcmlwdGlvbikpICU+JQogIGZpbHRlcihpcy5uYShyZWR1Y2VkX29mZmVuc2VfZGVzYykgfCByZWR1Y2VkX29mZmVuc2VfZGVzYyAhPSAiRFJJVklORyBXSElMRSBJTlRPWElDQVRFRCIpICAlPiUKICBmaWx0ZXIoaXMubmEocmVkdWNlZF9vZmZlbnNlX2Rlc2MpIHwgcmVkdWNlZF9vZmZlbnNlX2Rlc2MgIT0gIkRXSSBXL0JBQyAwLjE1IE9SIEhJR0hFUiIpCgpjbGVhbl9zY3JhcGVkCmBgYApPa2F5IC0tIHNvIEkgYW0gbG9va2luZyBhdCB0aGUgc3BlY2lmaWMgZG9ja2V0IGxpbmVzIEkgYW0gaW50ZXJlc3RlZCBpbiwgd2hpY2ggaXMgaGVscGZ1bCAtLSBidXQgSSBuZWVkIHRvIGZvY3VzIG9uIHRoZSBjYXNlcy4gCgpTdXBlciBpbXBvcnRhbnQgdG8gbm90ZSB0aGFuIHRoZSAibiIgY29sdW1uIHJlYWxseSBkb2Vzbid0IG1hdHRlci4gSXQncyBhIHRhbGx5IG9mIHRoZSBudW1iZXIgb2YgdGltZXMgaW5mb3JtYXRpb24gaW4gdGhlIHJvdyBhcHBlYXJzIGluIGFsbCBvZiB0aGUgZG9ja2V0IGxpbmVzLiAKCmBgYHtyfQpjaGVja19jaGFyZ2VzIDwtIGNsZWFuX3NjcmFwZWQgJT4lCiAgZ3JvdXBfYnkob2ZmZW5zZV9kZXNjcmlwdGlvbiwgcmVkdWNlZF9vZmZlbnNlX2Rlc2MpICU+JQogIHRhbGx5KCkKCmNoZWNrX2NoYXJnZXMKYGBgCgpgYGB7cn0KY2hlY2tfZXZlbnRzIDwtIGNsZWFuX3NjcmFwZWQgJT4lCiAgZ3JvdXBfYnkoZXZlbnREZXNjcmlwdGlvbikgJT4lCiAgdGFsbHkoKQoKY2hlY2tfZXZlbnRzCmBgYAoKQW5kIGhlcmUgYXJlIHRoZSBjYXNlIG51bWJlcnMgd2UgY2FyZSBhYm91dCEKCmBgYHtyfQpkd2lfY2FzZV9udW1iZXJzIDwtIGNsZWFuX3NjcmFwZWQgJT4lCiAgZGlzdGluY3QoY2FzZV9jYXVzZV9uYnIpICU+JQogIG11dGF0ZShjYXNlX2NhdXNlX25iciA9IGFzLmNoYXJhY3RlcihjYXNlX2NhdXNlX25icikpCgpkd2lfY2FzZV9udW1iZXJzCmBgYAoKQW5kIGhlcmUgYXJlIHRoZSBjYXNlIG51bWJlcnMgdGhhdCBhcmUgb2JzdHJ1Y3Rpb24gYW5kIGFyZSBhY3R1YWxseSBvYnN0cnVjdGlvbiEKCmBgYHtyfQpub25kd2lfb2JzdCA8LSBjbGVhbl9kd2lfcHJlICU+JQogICMgY2xlYW5fZHdpIGNvbWVzIGZyb20gZHdpX2FuYWx5c2lzX3NlbGluZQogICMgZHdpX2Nhc2VfbnVtYmVycyBjb21lcyBmcm9tIHBvc3Qtcnlhbi1zY3JhcGUtYW5hbHlzaXMKICBhbnRpX2pvaW4oZHdpX2Nhc2VfbnVtYmVycykgJT4lCiAgZmlsdGVyKGdyZXBsKCJPQlNUUlVDIiwgb2ZmZW5zZV9kZXNjcmlwdGlvbikpICU+JQogIGZpbHRlcihvZmZlbnNlX2Rlc2NyaXB0aW9uICE9ICJPQlNUUlVDVCBISUdIV0FZLUlOVE9YSUNBVElPTiIpCgpub25kd2lfb2JzdApgYGAKCmBgYHtyfQpub25kd2lfb2JzdF9jYXNlcyA8LSBub25kd2lfb2JzdCAlPiUKICBncm91cF9ieShjYXNlX2NhdXNlX25icikgJT4lCiAgdGFsbHkoKQoKbm9uZHdpX29ic3RfY2FzZXMKYGBgCgpUaGUgb2ZmaWNpYWwgZHdpIGNhc2VzLCBubyBtb3JlIG9mIHRoZSByZWd1bGFyLCBub24tYWxjb2hvbCBwYXNzYWdld2F5IG9ic3RydWN0aW9uCgpgYGB7cn0KY2xlYW5fZHdpIDwtIGNsZWFuX2R3aV9wcmUgJT4lCiAgYW50aV9qb2luKG5vbmR3aV9vYnN0LCBieSA9IGMoImNhc2VfY2F1c2VfbmJyIiwgIm9mZmVuc2VfZGVzYyIpKQoKY2xlYW5fZHdpCmBgYAoKYGBge3J9CmNoZWNrX2NoYXJnZXMgPC0gY2xlYW5fZHdpICU+JQogIGdyb3VwX2J5KG9mZmVuc2VfZGVzYywgcmVkdWNlZF9vZmZlbnNlX2Rlc2MpICU+JQogIHRhbGx5KCkKCmNoZWNrX2NoYXJnZXMKYGBgCmBgYHtyfQpvYnN0cnVjdF9oaWdod2F5X2NoZWNrIDwtIGNsZWFuX2R3aSAlPiUKICAjbXV0YXRlKHBvc3RfanVkaWNpYWxfeWVhciA9IGZsb29yX2RhdGUocG9zdF9qdWRpY2lhbF9kYXRlLCB1bml0ID0gInllYXIiKSkgJT4lCiAgZ3JvdXBfYnkob2ZmZW5zZV9kZXNjLCByZWR1Y2VkX29mZmVuc2VfZGVzYywganVkZ2VtZW50X3llYXIpICU+JQogIHRhbGx5KCkgJT4lCiAgZmlsdGVyKGdyZXBsKCJISUdIV0FZIiwgcGFzdGUob2ZmZW5zZV9kZXNjLCByZWR1Y2VkX29mZmVuc2VfZGVzYykpKSAlPiUKICBncm91cF9ieShqdWRnZW1lbnRfeWVhcikgJT4lCiAgc3VtbWFyaXNlKHN1bV9jaGFyZ2UgPSBzdW0obikpICU+JQogIGZpbHRlcihqdWRnZW1lbnRfeWVhciA+IGFzLkRhdGUoIjIwMTQtMDEtMDEiKSkKCm9ic3RydWN0X2hpZ2h3YXlfY2hlY2sKYGBgCgpgYGB7cn0Kb2JzdHJ1Y3RfaGlnaHdheV9jaGVjazIgPC0gY2xlYW5fZHdpICU+JQogIGdyb3VwX2J5KG9mZmVuc2VfZGVzYywganVkZ2VtZW50X3llYXIpICU+JQogIHRhbGx5KCkgJT4lCiAgZmlsdGVyKGdyZXBsKCJISUdIV0FZIiwgcGFzdGUob2ZmZW5zZV9kZXNjKSkpICU+JQogIGdyb3VwX2J5KGp1ZGdlbWVudF95ZWFyKSAlPiUKICBzdW1tYXJpc2Uoc3VtX2NoYXJnZSA9IHN1bShuKSkgJT4lCiAgZmlsdGVyKGp1ZGdlbWVudF95ZWFyID4gYXMuRGF0ZSgiMjAxNC0wMS0wMSIpKQoKb2JzdHJ1Y3RfaGlnaHdheV9jaGVjazIKYGBgCgoKYGBge3J9CmNoZWNrX2NoYXJnZXNfbm9fcmVkdWNlIDwtIGNsZWFuX2R3aSAlPiUKICBncm91cF9ieShvZmZlbnNlX2Rlc2MsIG9mZmVuc2VfY29kZSkgJT4lCiAgdGFsbHkoKSAlPiUKICBpbm5lcl9qb2luKG9mZmljaWFsX2R3aV9jb2RlcywgYnkgPSBjKCJvZmZlbnNlX2NvZGUiID0gImNvdW50eV9vZmZlbnNlX2NvZGUiKSkgJT4lCiAgc2VsZWN0KC0oMTo0KSkKCmNoZWNrX2NoYXJnZXNfbm9fcmVkdWNlCmBgYAoKYGBge3J9CiN3cml0ZV9jc3YoY2hlY2tfY2hhcmdlc19ub19yZWR1Y2UsICJEYXRhL215X2V4cG9ydHMvTUVUSE9EX1RBQkxFX09GRkVOU0VfREVTQy5jc3YiKQpgYGAKCgpgYGB7cn0KcHBsIDwtIGNsZWFuX2R3aSAlPiUKICBncm91cF9ieShzaWQpICU+JQogIHRhbGx5KCkKCnBwbApgYGAKCk5PVi4gNyBBRERJVElPTjogb2ZmZW5zZSB0eXBlCgpgYGB7cn0Kb2dfY2hhcmdlcyA8LSBjbGVhbl9kd2kgJT4lCiAgZ3JvdXBfYnkob2ZmZW5zZV9kZXNjLCByZWR1Y2VkX29mZmVuc2VfZGVzYykgJT4lCiAgdGFsbHkoKSAlPiUKICAjZmlsdGVyKCFncmVwbCgiQlNUUlVDIiwgb2ZmZW5zZV9kZXNjKSkgJT4lCiAgbXV0YXRlKG9nX3R5cGUgPSBjYXNlX3doZW4oCiAgICBncmVwbCgiQlNUUlVDIiwgb2ZmZW5zZV9kZXNjKSB+ICJPYnN0cnVjdGlvbiIsCiAgICBUUlVFIH4gIk90aGVyIikpICU+JQogIGdyb3VwX2J5KG9nX3R5cGUpICU+JQogIHN1bW1hcmlzZShzdW0gPSBzdW0obikpCgpvZ19jaGFyZ2VzCmBgYApOT1YuIDcgQURESVRJT046IHJlZHVjZWQgb2ZmZW5zZSB0eXBlCgpgYGB7cn0Kb2dfY2hhcmdlcyA8LSBjbGVhbl9kd2kgJT4lCiAgZ3JvdXBfYnkob2ZmZW5zZV9kZXNjLCByZWR1Y2VkX29mZmVuc2VfZGVzYykgJT4lCiAgdGFsbHkoKSAlPiUKICBmaWx0ZXIoIWdyZXBsKCJCU1RSVUMiLCBvZmZlbnNlX2Rlc2MpKSAlPiUKICBtdXRhdGUodHlwZV9yZWR1Y2VkID0gY2FzZV93aGVuKAogICAgZ3JlcGwoIkJTVFJVQyIsIHJlZHVjZWRfb2ZmZW5zZV9kZXNjKSB+ICJPYnN0cnVjdGlvbiIsCiAgICBpcy5uYShyZWR1Y2VkX29mZmVuc2VfZGVzYykgfiAiTm8gUmVkdWN0aW9uIiwKICAgIFRSVUUgfiAiT3RoZXIgUmVkdWN0aW9uIikpICU+JQogIGdyb3VwX2J5KHR5cGVfcmVkdWNlZCkgJT4lCiAgc3VtbWFyaXNlKHN1bSA9IHN1bShuKSkKCm9nX2NoYXJnZXMKYGBgCgojIEFuYWx5c2lzCgojIyBTY3JhcGVkIENhc2UgSW5mb3JtYXRpb24KCiMjIyBHZW5lcmFsIEFuYWx5c2lzLCBhbGwgb2JzdHJ1Y3Rpb24gY29kZXMKCk5vdyBJIHdhbnQgdG8ga25vdyBob3cgbWFueSBwZW9wbGUgYXJlIGluIHRoaXMgZGF0YXNldC4gVGhlICJuIiBjb2x1bW4gaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGV5IGFwcGVhciBpbiBteSBkYXRhc2V0IG9mIGp1c3QgIkRXSS1yZWxhdGVkIiBkb2NrZXQgZXZlbnRzLiBXZSBjYW4gaWdub3JlIHRoYXQuCgpgYGB7cn0KcGVvcGxlX2luX2hlcmUgPC0gY2xlYW5fc2NyYXBlZCAlPiUKICBncm91cF9ieShzaWQpICU+JQogIHRhbGx5KCkKCnBlb3BsZV9pbl9oZXJlCmBgYAoKQW5zd2VyOiBvZiB0aGUgMTksNzE0IHdobyBoYWQgYW4gb2JzdHJ1Y3Rpb24gY2hhcmdlLCBhYm91dCAxOSw0NDQgaGFkIHNvbWUgc29ydCBvZiBEV0kgaW5kaWNhdGlvbi4gSSBrbm93IHRoaXMgYmVjYXVzZSB0aGVyZSBhcmUgMTksNDQ0IHJvd3MKCmBgYHtyfQpwZW9wbGVfY2FzZV9pbl9oZXJlIDwtIGNsZWFuX3NjcmFwZWQgJT4lCiAgZ3JvdXBfYnkoc2lkLCBjYXNlX2NhdXNlX25icikgJT4lCiAgI2dyb3VwX2J5KHNpZCkgJT4lCiAgdGFsbHkoKQoKcGVvcGxlX2Nhc2VfaW5faGVyZQpgYGAKQW5kIG9mIHRoZSAxOSw3NzQgY2FzZXMsIDE5LDQ5MiBvZiB0aGVtIHdlcmUgcmVsYXRlZCB0byBkcmlua2luZy4KCiMjIyBQYXNzYWdld2F5L1JvYWR3YXkgQW5hbHlzaXMKCk5vdyBJIHdhbnQgdG8gbG9vayBhdCBwZW9wbGUgd2hvIG9ubHkgaGF2ZSB0aGlzIGNoYXJnZSBhbmQgc2VlIGlmIHRoZXkgaGF2ZSBhbGNvaG9sLXJlbGF0ZWQgc3R1ZmYKClNvIHdlIGdvIHRvIHRoZSBEV0kgZG9ja2V0IGV2ZW50IGRhdGEsIGFuZCBzYXkgLS0gZ2l2ZSBtZSBvbmx5IHRob3NlIHdpdGggdGhlIHBhc3NhZ2V3YXkvcm9hZHdheSBjaGFyZ2UKCk5vdyBsZXQncyBjb3VudCB0aGUgcGVvcGxlCgpgYGB7cn0KcGFzc2FnZXdheSA8LSBjbGVhbl9zY3JhcGVkICU+JQogIGZpbHRlcihncmVwbCgiT0JTVFJVQ1QgUEFTU0FHRVdBWS9ST0FEV0FZIiwgb2ZmZW5zZV9kZXNjcmlwdGlvbikgfCBncmVwbCgiT0JTVFJVQ1QgUEFTU0FHRVdBWS9ST0FEV0FZIiwgcmVkdWNlZF9vZmZlbnNlX2Rlc2MpKSAlPiUKICBmaWx0ZXIoaXMubmEocmVkdWNlZF9vZmZlbnNlX2Rlc2MpIHwgcmVkdWNlZF9vZmZlbnNlX2Rlc2MgIT0gIk9CU1RSVUNUIEhJR0hXQVktSU5UT1hJQ0FUSU9OIikgJT4lCiAgYXJyYW5nZShzaWQpCgpwYXNzYWdld2F5CmBgYAoKUXVpY2sgZG9ja2V0IGNoZWNrIGZvciBBbGxpZQoKYGBge3J9CiN3cml0ZV9jc3YocGFzc2FnZXdheSwgIkRhdGEvbXlfZXhwb3J0cy9hbGxpZV9jaGVja19wYXNzYWdld2F5LmNzdiIpCmBgYAoKYGBge3J9CnBhc3NhZ2V3YXlfY2hlY2tfZG9ja2V0IDwtIHBhc3NhZ2V3YXkgJT4lCiAgZ3JvdXBfYnkoZXZlbnREZXNjcmlwdGlvbikgJT4lCiAgdGFsbHkoKQoKcGFzc2FnZXdheV9jaGVja19kb2NrZXQKYGBgCgoKTGV0IG1lIGRvdWJsZSBjaGVjayBJJ20gbG9va2luZyBhdCB0aGUgY2hhcmdlcyBJIHdhbnQgdG8gbG9vayBhdC4KCmBgYHtyfQpwYXNzYWdld2F5X29mZmVuc2VfZGVzYyA8LSBwYXNzYWdld2F5ICU+JQogIHNlbGVjdChzaWQsIG9mZmVuc2VfZGVzY3JpcHRpb24sIHJlZHVjZWRfb2ZmZW5zZV9kZXNjKSAlPiUKICBkaXN0aW5jdCgpICU+JQogIGdyb3VwX2J5KG9mZmVuc2VfZGVzY3JpcHRpb24sIHJlZHVjZWRfb2ZmZW5zZV9kZXNjKSAlPiUKICB0YWxseSgpICAlPiUKICBhcnJhbmdlKGRlc2MobikpCgpwYXNzYWdld2F5X29mZmVuc2VfZGVzYwpgYGAKCkFuZCBub3cgbGV0J3MgY291bnQgdGhlIHBlb3BsZSB3aXRoIHRoZSBjaGFyZ2UKCmBgYHtyfQpwYXNzYWdld2F5X3BwbCA8LSBwYXNzYWdld2F5ICU+JQogIGdyb3VwX2J5KHNpZCkgJT4lCiAgdGFsbHkoKSAKCnBhc3NhZ2V3YXlfcHBsCgpgYGAKClRoZXJlIGFyZSAzLDU2MiBwZW9wbGUgdGhhdCBoYXZlIGFuIGluZGljYXRpb24gb2YgYSBEV0kgaW4gdGhlIGRhdGFzZXQuCgpgYGB7cn0KcGFzc2FnZXdheV9jYXNlIDwtIHBhc3NhZ2V3YXkgJT4lCiAgZ3JvdXBfYnkoY2FzZV9jYXVzZV9uYnIpICU+JQogIHRhbGx5KCkgICU+JQogIGFycmFuZ2UoLW4pCgpwYXNzYWdld2F5X2Nhc2UKYGBgClRoZXJlIGFyZSAzLDU2MyBjYXNlcyB0aGF0IGhhdmUgYW4gaW5kaWNhdGlvbiBvZiBhIERXSSBpbiB0aGUgZGF0YXNldCB3aXRoIDMsNTYyIHBlb3BsZQoKQnV0IEkga25vdyB0aGUgbWFpbiBjcml0ZXJpYSB3ZSB3YW50IHRvIGxvb2sgZm9yIGlzIGEgQkFDIGFib3ZlIDAuMTUgb3IgaGlnaGVyLiBTbyBob3cgbWFueSBvZiB0aGVzZSBwZW9wbGUgaGFkIGEgQkFDIG9mIDAuMTUgb3IgaGlnaGVyPwoKQWxsIHRoZSBCQUMgZXZlbnRzOgoKYGBge3J9CnBhc3NfQkFDX2V2ZW50cyA8LSBwYXNzYWdld2F5ICU+JQogIGZpbHRlcihncmVwbChwYXN0ZShiYWNfc3BlY2lmaWNfb2ZmaWNpYWxfZHdpX2V2ZW50cywgY29sbGFwc2U9InwpIiksIGV2ZW50RGVzY3JpcHRpb24pKSAKCnBhc3NfQkFDX2V2ZW50cwpgYGAKCkFsbCB0aGUgQkFDIHBlb3BsZToKCmBgYHtyfQpwZW9wbGVfcGFzc19CQUMgPC0gcGFzc19CQUNfZXZlbnRzICU+JQogIGdyb3VwX2J5KHNpZCkgJT4lCiAgdGFsbHkoKQoKcGVvcGxlX3Bhc3NfQkFDCmBgYAoKVGhlcmUgYXJlIDEsMzg1IHBlb3BsZSB3aXRoIGEgQkFDIG9mIDAuMTUgb3IgaGlnaGVyLgoKYGBge3J9CmNhc2VfcGFzc19CQUMgPC0gcGFzc19CQUNfZXZlbnRzICU+JQogIGdyb3VwX2J5KGNhc2VfY2F1c2VfbmJyKSAlPiUKICB0YWxseSgpCgpjYXNlX3Bhc3NfQkFDCmBgYApUaGVyZSBhcmUgMSwzODUgY2FzZXMgd2l0aCBhIEJBQyBvZiAwLjE1IG9yIGhpZ2hlci4KCkJ1dCB5b3UgYXJlIHByb2JhYmx5IHdvbmRlcmluZyAtLSB3ZWxsIGhvdyBtYW55IHBlb3BsZSBoYWQgdGhpcyBwYXNzYWdld2F5IHJvYWR3YXkgY2hhcmdlPwoKTGV0J3MgbG9vayBhdCB0aGUgZGF0YXNldCBiZWZvcmUgd2UgZmlsdGVyZWQgZm9yIERXSSBwZW9wbGUKCmBgYHtyfQpjb3VudF9hbGxfcGFzc2FnZXdheSA8LSBjbGVhbl9zY3JhcGVkX3ByZXAgJT4lCiAgZmlsdGVyKGdyZXBsKCJPQlNUUlVDVCBQQVNTQUdFV0FZL1JPQURXQVkiLCBvZmZlbnNlX2Rlc2NyaXB0aW9uKSB8IGdyZXBsKCJPQlNUUlVDVCBQQVNTQUdFV0FZL1JPQURXQVkiLCByZWR1Y2VkX29mZmVuc2VfZGVzYykpICU+JQogIGZpbHRlcihpcy5uYShyZWR1Y2VkX29mZmVuc2VfZGVzYykgfCByZWR1Y2VkX29mZmVuc2VfZGVzYyAhPSAiT0JTVFJVQ1QgSElHSFdBWS1JTlRPWElDQVRJT04iKSAlPiUKICBncm91cF9ieShzaWQpICU+JQogICNncm91cF9ieShzaWQsIGNhc2VfY2F1c2VfbmJyKSAlPiUKICB0YWxseSgpCiAgCmNvdW50X2FsbF9wYXNzYWdld2F5CmBgYAoKKipGaW5hbCBGaW5kaW5nKio6IE9mIHRoZSAzLDgzNyBjYXNlcyB3aXRoIG9ic3RydWN0aW9uIG9mIHBhc3NhZ2V3YXkgY2hhcmdlIGJldHdlZW4gSmFuLiAxLCAyMDA5IGFuZCBKYW4uIDEzLCAyMDIyLCAzLDU2MiBvZiB0aGVtIGhhdmUgYmVlbiBhc3NvY2lhdGVkIHdpdGggYSBkcmlua2luZyBhYm92ZSB0aGUgbGVnYWwgbGltaXQuIDEsMzg1IHBlb3BsZSBoYWQgYSBibG9vZCBhbGNvaG9sIGNvbnRlbnQgYWJvdmUgMC4xNS4KCiMjIyBIaWdod2F5IEludG94IE9ic3RydWN0aW9uCgpPa2F5LCBsZXQncyBsb29rIGF0IHBlb3BsZSB3aXRoIHRoZSBvYnN0cnVjdGlvbiBoaWdod2F5LWludG94aWNhdGlvbiBjaGFyZ2UuCgpGaXJzdCBhbGwgb2YgdGhlIGRvY2tldCBldmVudHMgd2l0aCB0aGlzIGNoYXJnZToKCmBgYHtyfQpoaWdod2F5X2ludG94IDwtIGNsZWFuX3NjcmFwZWQgJT4lCiAgZmlsdGVyKGdyZXBsKCJPQlNUUlVDVCBISUdIV0FZLUlOVE9YIiwgb2ZmZW5zZV9kZXNjcmlwdGlvbikgfCBncmVwbCgiT0JTVFJVQ1QgSElHSFdBWS1JTlRPWCIsIHJlZHVjZWRfb2ZmZW5zZV9kZXNjKSkgJT4lCiAgZmlsdGVyKGlzLm5hKHJlZHVjZWRfb2ZmZW5zZV9kZXNjKSB8IHJlZHVjZWRfb2ZmZW5zZV9kZXNjICE9ICJPQlNUUlVDVCBQQVNTQUdFV0FZL1JPQURXQVkvV0EiKQoKaGlnaHdheV9pbnRveApgYGAKCkp1c3QgdG8gcHJvdmUgdG8gbXlzZWxmIHRoYXQgSSBhbSBpbiBmYWN0IGxvb2tpbmcgYXQgcGVvcGxlIHdpdGggdGhlc2Ugb25seSB0aGVzZSBjaGFyZ2VzLCBsZXQncyBkb3VibGUgY2hlY2s6CgpgYGB7cn0KaGlnaHdheV9pbnRveF9vZmZlbnNlX2Rlc2MgPC0gaGlnaHdheV9pbnRveCAlPiUKICBzZWxlY3Qoc2lkLCBvZmZlbnNlX2Rlc2NyaXB0aW9uLCByZWR1Y2VkX29mZmVuc2VfZGVzYykgJT4lCiAgZGlzdGluY3QoKSAlPiUKICBncm91cF9ieShvZmZlbnNlX2Rlc2NyaXB0aW9uLCByZWR1Y2VkX29mZmVuc2VfZGVzYykgJT4lCiAgdGFsbHkoKSAgJT4lCiAgYXJyYW5nZShkZXNjKG4pKQoKaGlnaHdheV9pbnRveF9vZmZlbnNlX2Rlc2MKYGBgCgpOb3cgdGhlIG51bWJlciBvZiBwZW9wbGUgd2l0aCB0aGlzIGNoYXJnZQoKYGBge3J9CmNhc2VfaW5faGVyZV9oaWdod2F5X2ludG94IDwtIGhpZ2h3YXlfaW50b3ggJT4lCiAgZ3JvdXBfYnkoY2FzZV9jYXVzZV9uYnIpICU+JQogICNncm91cF9ieShzaWQpICU+JQogIHRhbGx5KCkKCmNhc2VfaW5faGVyZV9oaWdod2F5X2ludG94CmBgYAoKYGBge3J9CnBlb3BsZV9pbl9oZXJlX2hpZ2h3YXlfaW50b3ggPC0gaGlnaHdheV9pbnRveCAlPiUKICBncm91cF9ieShzaWQpICU+JQogIHRhbGx5KCkKCnBlb3BsZV9pbl9oZXJlX2hpZ2h3YXlfaW50b3gKYGBgCgpTbywgdGhlcmUgYXJlIDE1LDkyOSBjYXNlcyBjaGFyZ2VkIHdpdGggKG9yIGhhZCB0aGVpciBjaGFyZ2UgcmVkdWNlZCB0bykgIk9CU1RSVUNUIEhJR0hXQVktSU5UT1hJQ0FUSU9OLiIgMTUsODkxIHBlb3BsZQoKQnV0IEkga25vdyB0aGUgbWFpbiBjcml0ZXJpYSB3ZSB3YW50IHRvIGxvb2sgZm9yIGlzIGEgQkFDIGFib3ZlIDAuMTUgb3IgaGlnaGVyLiBTbyBob3cgbWFueSBvZiB0aGVzZSBwZW9wbGUgaGFkIGEgQkFDIG9mIDAuMTUgb3IgaGlnaGVyPwoKQWxsIHRoZSBCQUMgZXZlbnRzOgoKYGBge3J9CmhpZ2h3YXlfaW50b3hfQkFDIDwtIGhpZ2h3YXlfaW50b3ggJT4lCiAgZmlsdGVyKGdyZXBsKHBhc3RlKGJhY19zcGVjaWZpY19vZmZpY2lhbF9kd2lfZXZlbnRzLCBjb2xsYXBzZT0ifCkiKSwgZXZlbnREZXNjcmlwdGlvbikpIAoKaGlnaHdheV9pbnRveF9CQUMKYGBgCgpBbGwgdGhlIEJBQyBwZW9wbGU6CgpgYGB7cn0KY2FzZV9oaWdod2F5X2ludG94X0JBQyA8LSBoaWdod2F5X2ludG94X0JBQyAlPiUKICBncm91cF9ieShjYXNlX2NhdXNlX25icikgJT4lCiAgdGFsbHkoKQoKY2FzZV9oaWdod2F5X2ludG94X0JBQwpgYGAKCjMsNTY0IGNhc2VzIG9mIEJBQyAgMC4xNSBpbiBoaWdod2F5IGludG94aWNhdGlvbgoKYGBge3J9CnBlb3BsZV9oaWdod2F5X2ludG94X0JBQyA8LSBoaWdod2F5X2ludG94X0JBQyAlPiUKICBncm91cF9ieShzaWQpICU+JQogIHRhbGx5KCkKCnBlb3BsZV9oaWdod2F5X2ludG94X0JBQwpgYGAKClNvIHRoZXJlIGFyZSAzLDU2NCBjYXNlcyB3aG8gaGFkIGEgQkFDIGFib3ZlIDAuMTUgMyw1NTggcGVvcGxlCgpIb3cgbWFueSBwZW9wbGUgaW4gdG90YWwgaGFkIGEgaGlnaHdheSBpbnRveGljYXRpb24gY2hhcmdlPwoKYGBge3J9CmNvdW50X2FsbF9oaWdod2F5X2ludG94IDwtIGNsZWFuX3NjcmFwZWRfcHJlcCAlPiUKICBmaWx0ZXIoZ3JlcGwoIk9CU1RSVUNUIEhJR0hXQVktSU5UT1giLCBvZmZlbnNlX2Rlc2NyaXB0aW9uKSB8IGdyZXBsKCJPQlNUUlVDVCBISUdIV0FZLUlOVE9YIiwgcmVkdWNlZF9vZmZlbnNlX2Rlc2MpKSAlPiUKICBmaWx0ZXIoaXMubmEocmVkdWNlZF9vZmZlbnNlX2Rlc2MpIHwgcmVkdWNlZF9vZmZlbnNlX2Rlc2MgIT0gIk9CU1RSVUNUIFBBU1NBR0VXQVkvUk9BRFdBWS9XQSIpICU+JQogIGdyb3VwX2J5KGNhc2VfY2F1c2VfbmJyKSAlPiUKICB0YWxseSgpCgogIApjb3VudF9hbGxfaGlnaHdheV9pbnRveApgYGAKCioqRmluYWwgRmluZGluZyoqOiBPZiB0aGUgMTUsOTI5IGNhc2VzIHdpdGggYW4gb2JzdHJ1Y3Rpb24gaGlnaHdheSBpbnRveGljYXRpb24gY2hhcmdlIGJldHdlZW4gSmFuLiAxLCAyMDA5IGFuZCBKYW4uIDEzLCAyMDIyLCAxNSw5Mjkgb2YgdGhlbSBoYXZlIGJlZW4gYXNzb2NpYXRlZCB3aXRoIGEgZHJpbmtpbmcgYWJvdmUgdGhlIGxlZ2FsIGxpbWl0LiAzLDU2NCBvZiB0aGUgY2FzZXMgaGFkIGEgZG9ja2V0IGxpbmUgaW5kaWNhdGluZyB0aGF0IHRoZWlyIEJBQyB3YXMgYWJvdmUgMC4xNS4KCgoKCiMjIEJBQyBtYXN0ZXIKCmBgYHtyfQpiYWNfbWFzdGVyIDwtIGNsZWFuX3NjcmFwZWQgJT4lICAgCiAgZmlsdGVyKGdyZXBsKHBhc3RlKGJhY19zcGVjaWZpY19vZmZpY2lhbF9kd2lfZXZlbnRzLCBjb2xsYXBzZT0ifCkiKSwgZXZlbnREZXNjcmlwdGlvbikpIAoKCmJhY19wcGwgPC0gYmFjX21hc3RlciAlPiUKICBncm91cF9ieShzaWQsIGNhc2VfY2F1c2VfbmJyKSAlPiUKICB0YWxseSgpICU+JQogIGFycmFuZ2UoZGVzYyhuKSkgJT4lCiAgZ3JvdXBfYnkoc2lkKSAlPiUKICB0YWxseSgpICU+JQogIGFycmFuZ2UoZGVzYyhuKSkKCmJhY19wcGwKYGBgCgpgYGB7cn0KZG9ja2V0Xzk3NjgwOSA8LSBjbGVhbl9zY3JhcGVkICU+JQogIGZpbHRlcihzaWQgPT0gMTA5OTQ1NikKCmRvY2tldF85NzY4MDkKYGBgCgoxMDM2NjcyCgoKIyMgRFdJIG1hc3RlcgoKYGBge3J9CmR3aV9tYXN0ZXIgPC0gY2xlYW5fc2NyYXBlZCAlPiUgICAKICBmaWx0ZXIoZ3JlcGwocGFzdGUob2ZmaWNpYWxfZHdpX2V2ZW50cywgY29sbGFwc2U9InwpIiksIGV2ZW50RGVzY3JpcHRpb24pKSAKCgpkd2lfcHBsIDwtIGR3aV9tYXN0ZXIgJT4lCiAgZ3JvdXBfYnkoc2lkLCBjYXNlX2NhdXNlX25icikgJT4lCiAgdGFsbHkoKSAlPiUKICBhcnJhbmdlKGRlc2MobikpICU+JQogIGdyb3VwX2J5KHNpZCkgJT4lCiAgdGFsbHkoKSAlPiUKICBhcnJhbmdlKGRlc2MobikpCgpkd2lfcHBsCmBgYAoKIyMgRGF0ZWQgYWZ0ZXIgT2N0LiAyNywgMjAyMAoKYGBge3J9Cm9jdDI3IDwtIGNsZWFuX3NjcmFwZWQgJT4lCiAgZmlsdGVyKGV2ZW50RGF0ZSA+IGFzLkRhdGUoIjIwMjAtMTAtMjciKSkgCiAKCm9jdDI3CmBgYAoKYGBge3J9Cm9jdDI3X3BwbCA8LSBvY3QyNyAlPiUKIGdyb3VwX2J5KGNhc2VfY2F1c2VfbmJyKSAlPiUKICB0YWxseSgpCgpvY3QyN19wcGwKYGBgCgo0OTAgcGVvcGxlCgpgYGB7cn0Kb2N0MjdfQkFDX2V2ZW50cyA8LSBvY3QyNyAlPiUKICBmaWx0ZXIoZ3JlcGwocGFzdGUoYmFjX3NwZWNpZmljX29mZmljaWFsX2R3aV9ldmVudHMsIGNvbGxhcHNlPSJ8KSIpLCBldmVudERlc2NyaXB0aW9uKSkgCgpvY3QyN19CQUNfZXZlbnRzCmBgYAoKYGBge3J9Cm9jdDI3X0JBQ19wcGwgPC0gb2N0MjdfQkFDX2V2ZW50cyAlPiUKIGdyb3VwX2J5KGNhc2VfY2F1c2VfbmJyKSAlPiUKICB0YWxseSgpCgpvY3QyN19CQUNfcHBsCmBgYAoKCiMjIEFuc3dlcmluZyBFbWlsaWUncyBRdWVzdGlvbnMgYWJvdXQgRFdJCgpTaGUgd2FudHMgdGhlIGZvbGxvd2luZzoKCkNvZGVzIHRvIFB1bGw6IDU0MDQxMiAtLSBEcml2aW5nIFdoaWxlIEludG94aWNhdGVkIC0zRC9NIDU0MDQwNSAtLQpEcml2aW5nIFdoaWxlIEludG94aWNhdGVkIDNyZCA1NDA0MTggLS0gRFdJIHcvIHByZXYgaW50b3ggbWFuc2wgY29udmljdAoyMjk5OTkgLS0gRFdJIFN1YnNlcXVlbnQgT2ZmZW5zZSA0OTk5OTkgLS0gRFdJIC0tIDNyZCBBY2NpZGVudCA5MDkwMSAtLQpJbnRveGljYXRpb24gTWFuc2xhdWdodGVyIDkwOTAyIC0tIEludG94IE1hbnNsYXVnaHRlciBQdWJsIFNlcnYKCmBgYHtyfQplbWlsaWVfcHVsbCA8LSBjbGVhbl9pbmRpdmlkdWFsX2J5X2NoYXJnZXMgJT4lCiAgZmlsdGVyKGdyZXBsKCI1NDA0MTIiLCBwYXN0ZShvZmZlbnNlX2Rlc2NyaXB0aW9uX29mZmVuc2VfMS4wLCByZWR1Y2VkX29mZmVuc2VfZGVzY19vZmZlbnNlXzEuMCwgb2ZmZW5zZV9kZXNjcmlwdGlvbl9vZmZlbnNlXzEuMSwgcmVkdWNlZF9vZmZlbnNlX2Rlc2Nfb2ZmZW5zZV8xLjEsICBvZmZlbnNlX2Rlc2NyaXB0aW9uX29mZmVuc2VfMS4yLCByZWR1Y2VkX29mZmVuc2VfZGVzY19vZmZlbnNlXzEuMiwgb2ZmZW5zZV9kZXNjcmlwdGlvbl9vZmZlbnNlXzEuMywgcmVkdWNlZF9vZmZlbnNlX2Rlc2Nfb2ZmZW5zZV8xLjMsIG9mZmVuc2VfZGVzY3JpcHRpb25fb2ZmZW5zZV8xLjQsIHJlZHVjZWRfb2ZmZW5zZV9kZXNjX29mZmVuc2VfMS40LCBvZmZlbnNlX2Rlc2NyaXB0aW9uX29mZmVuc2VfMS41LCByZWR1Y2VkX29mZmVuc2VfZGVzY19vZmZlbnNlXzEuNSwgb2ZmZW5zZV9kZXNjcmlwdGlvbl9vZmZlbnNlXzIuMCwgcmVkdWNlZF9vZmZlbnNlX2Rlc2Nfb2ZmZW5zZV8yLjAsIG9mZmVuc2VfZGVzY3JpcHRpb25fb2ZmZW5zZV8yLjEsIHJlZHVjZWRfb2ZmZW5zZV9kZXNjX29mZmVuc2VfMi4xLCBvZmZlbnNlX2Rlc2NyaXB0aW9uX29mZmVuc2VfMi4yLCByZWR1Y2VkX29mZmVuc2VfZGVzY19vZmZlbnNlXzIuMiwgb2ZmZW5zZV9kZXNjcmlwdGlvbl9vZmZlbnNlXzIuMywgcmVkdWNlZF9vZmZlbnNlX2Rlc2Nfb2ZmZW5zZV8yLjMsIG9mZmVuc2VfZGVzY3JpcHRpb25fb2ZmZW5zZV8zLjAsIHJlZHVjZWRfb2ZmZW5zZV9kZXNjX29mZmVuc2VfMy4wLCBvZmZlbnNlX2Rlc2NyaXB0aW9uX29mZmVuc2VfMy4xLCByZWR1Y2VkX29mZmVuc2VfZGVzY19vZmZlbnNlXzMuMSwgb2ZmZW5zZV9kZXNjcmlwdGlvbl9vZmZlbnNlXzMuMiwgcmVkdWNlZF9vZmZlbnNlX2Rlc2Nfb2ZmZW5zZV8zLjIsIG9mZmVuc2VfZGVzY3JpcHRpb25fb2ZmZW5zZV8zLjMsIHJlZHVjZWRfb2ZmZW5zZV9kZXNjX29mZmVuc2VfMy4zLCBvZmZlbnNlX2Rlc2NyaXB0aW9uX29mZmVuc2VfMy40LCByZWR1Y2VkX29mZmVuc2VfZGVzY19vZmZlbnNlXzMuNCxvZmZlbnNlX2Rlc2NyaXB0aW9uX29mZmVuc2VfNC4wLCByZWR1Y2VkX29mZmVuc2VfZGVzY19vZmZlbnNlXzQuMCwgb2ZmZW5zZV9kZXNjcmlwdGlvbl9vZmZlbnNlXzQuMSwgcmVkdWNlZF9vZmZlbnNlX2Rlc2Nfb2ZmZW5zZV80LjEsb2ZmZW5zZV9kZXNjcmlwdGlvbl9vZmZlbnNlXzQuMiwgcmVkdWNlZF9vZmZlbnNlX2Rlc2Nfb2ZmZW5zZV80LjIsIG9mZmVuc2VfZGVzY3JpcHRpb25fb2ZmZW5zZV81LjAsIHJlZHVjZWRfb2ZmZW5zZV9kZXNjX29mZmVuc2VfNS4wLCBvZmZlbnNlX2Rlc2NyaXB0aW9uX29mZmVuc2VfNi4wLCByZWR1Y2VkX29mZmVuc2VfZGVzY19vZmZlbnNlXzYuMCwgb2ZmZW5zZV9kZXNjcmlwdGlvbl9vZmZlbnNlXzcuMCwgcmVkdWNlZF9vZmZlbnNlX2Rlc2Nfb2ZmZW5zZV83LjApKSAKICAgICAgICAgfCBncmVwbCgiNTQwNDA1IiwgcGFzdGUob2ZmZW5zZV9kZXNjcmlwdGlvbl9vZmZlbnNlXzEuMCwgcmVkdWNlZF9vZmZlbnNlX2Rlc2Nfb2ZmZW5zZV8xLjAsIG9mZmVuc2VfZGVzY3JpcHRpb25fb2ZmZW5zZV8xLjEsIHJlZHVjZWRfb2ZmZW5zZV9kZXNjX29mZmVuc2VfMS4xLCAgb2ZmZW5zZV9kZXNjcmlwdGlvbl9vZmZlbnNlXzEuMiwgcmVkdWNlZF9vZmZlbnNlX2Rlc2Nfb2ZmZW5zZV8xLjIsIG9mZmVuc2VfZGVzY3JpcHRpb25fb2ZmZW5zZV8xLjMsIHJlZHVjZWRfb2ZmZW5zZV9kZXNjX29mZmVuc2VfMS4zLCBvZmZlbnNlX2Rlc2NyaXB0aW9uX29mZmVuc2VfMS40LCByZWR1Y2VkX29mZmVuc2VfZGVzY19vZmZlbnNlXzEuNCwgb2ZmZW5zZV9kZXNjcmlwdGlvbl9vZmZlbnNlXzEuNSwgcmVkdWNlZF9vZmZlbnNlX2Rlc2Nfb2ZmZW5zZV8xLjUsIG9mZmVuc2VfZGVzY3JpcHRpb25fb2ZmZW5zZV8yLjAsIHJlZHVjZWRfb2ZmZW5zZV9kZXNjX29mZmVuc2VfMi4wLCBvZmZlbnNlX2Rlc2NyaXB0aW9uX29mZmVuc2VfMi4xLCByZWR1Y2VkX29mZmVuc2VfZGVzY19vZmZlbnNlXzIuMSwgb2ZmZW5zZV9kZXNjcmlwdGlvbl9vZmZlbnNlXzIuMiwgcmVkdWNlZF9vZmZlbnNlX2Rlc2Nfb2ZmZW5zZV8yLjIsIG9mZmVuc2VfZGVzY3JpcHRpb25fb2ZmZW5zZV8yLjMsIHJlZHVjZWRfb2ZmZW5zZV9kZXNjX29mZmVuc2VfMi4zLCBvZmZlbnNlX2Rlc2NyaXB0aW9uX29mZmVuc2VfMy4wLCByZWR1Y2VkX29mZmVuc2VfZGVzY19vZmZlbnNlXzMuMCwgb2ZmZW5zZV9kZXNjcmlwdGlvbl9vZmZlbnNlXzMuMSwgcmVkdWNlZF9vZmZlbnNlX2Rlc2Nfb2ZmZW5zZV8zLjEsIG9mZmVuc2VfZGVzY3JpcHRpb25fb2ZmZW5zZV8zLjIsIHJlZHVjZWRfb2ZmZW5zZV9kZXNjX29mZmVuc2VfMy4yLCBvZmZlbnNlX2Rlc2NyaXB0aW9uX29mZmVuc2VfMy4zLCByZWR1Y2VkX29mZmVuc2VfZGVzY19vZmZlbnNlXzMuMywgb2ZmZW5zZV9kZXNjcmlwdGlvbl9vZmZlbnNlXzMuNCwgcmVkdWNlZF9vZmZlbnNlX2Rlc2Nfb2ZmZW5zZV8zLjQsb2ZmZW5zZV9kZXNjcmlwdGlvbl9vZmZlbnNlXzQuMCwgcmVkdWNlZF9vZmZlbnNlX2Rlc2Nfb2ZmZW5zZV80LjAsIG9mZmVuc2VfZGVzY3JpcHRpb25fb2ZmZW5zZV80LjEsIHJlZHVjZWRfb2ZmZW5zZV9kZXNjX29mZmVuc2VfNC4xLG9mZmVuc2VfZGVzY3JpcHRpb25fb2ZmZW5zZV80LjIsIHJlZHVjZWRfb2ZmZW5zZV9kZXNjX29mZmVuc2VfNC4yLCBvZmZlbnNlX2Rlc2NyaXB0aW9uX29mZmVuc2VfNS4wLCByZWR1Y2VkX29mZmVuc2VfZGVzY19vZmZlbnNlXzUuMCwgb2ZmZW5zZV9kZXNjcmlwdGlvbl9vZmZlbnNlXzYuMCwgcmVkdWNlZF9vZmZlbnNlX2Rlc2Nfb2ZmZW5zZV82LjAsIG9mZmVuc2VfZGVzY3JpcHRpb25fb2ZmZW5zZV83LjAsIHJlZHVjZWRfb2ZmZW5zZV9kZXNjX29mZmVuc2VfNy4wKSkgCiAgICAgICAgIHwgZ3JlcGwoIjU0MDQxOCIsIHBhc3RlKG9mZmVuc2VfZGVzY3JpcHRpb25fb2ZmZW5zZV8xLjAsIHJlZHVjZWRfb2ZmZW5zZV9kZXNjX29mZmVuc2VfMS4wLCBvZmZlbnNlX2Rlc2NyaXB0aW9uX29mZmVuc2VfMS4xLCByZWR1Y2VkX29mZmVuc2VfZGVzY19vZmZlbnNlXzEuMSwgIG9mZmVuc2VfZGVzY3JpcHRpb25fb2ZmZW5zZV8xLjIsIHJlZHVjZWRfb2ZmZW5zZV9kZXNjX29mZmVuc2VfMS4yLCBvZmZlbnNlX2Rlc2NyaXB0aW9uX29mZmVuc2VfMS4zLCByZWR1Y2VkX29mZmVuc2VfZGVzY19vZmZlbnNlXzEuMywgb2ZmZW5zZV9kZXNjcmlwdGlvbl9vZmZlbnNlXzEuNCwgcmVkdWNlZF9vZmZlbnNlX2Rlc2Nfb2ZmZW5zZV8xLjQsIG9mZmVuc2VfZGVzY3JpcHRpb25fb2ZmZW5zZV8xLjUsIHJlZHVjZWRfb2ZmZW5zZV9kZXNjX29mZmVuc2VfMS41LCBvZmZlbnNlX2Rlc2NyaXB0aW9uX29mZmVuc2VfMi4wLCByZWR1Y2VkX29mZmVuc2VfZGVzY19vZmZlbnNlXzIuMCwgb2ZmZW5zZV9kZXNjcmlwdGlvbl9vZmZlbnNlXzIuMSwgcmVkdWNlZF9vZmZlbnNlX2Rlc2Nfb2ZmZW5zZV8yLjEsIG9mZmVuc2VfZGVzY3JpcHRpb25fb2ZmZW5zZV8yLjIsIHJlZHVjZWRfb2ZmZW5zZV9kZXNjX29mZmVuc2VfMi4yLCBvZmZlbnNlX2Rlc2NyaXB0aW9uX29mZmVuc2VfMi4zLCByZWR1Y2VkX29mZmVuc2VfZGVzY19vZmZlbnNlXzIuMywgb2ZmZW5zZV9kZXNjcmlwdGlvbl9vZmZlbnNlXzMuMCwgcmVkdWNlZF9vZmZlbnNlX2Rlc2Nfb2ZmZW5zZV8zLjAsIG9mZmVuc2VfZGVzY3JpcHRpb25fb2ZmZW5zZV8zLjEsIHJlZHVjZWRfb2ZmZW5zZV9kZXNjX29mZmVuc2VfMy4xLCBvZmZlbnNlX2Rlc2NyaXB0aW9uX29mZmVuc2VfMy4yLCByZWR1Y2VkX29mZmVuc2VfZGVzY19vZmZlbnNlXzMuMiwgb2ZmZW5zZV9kZXNjcmlwdGlvbl9vZmZlbnNlXzMuMywgcmVkdWNlZF9vZmZlbnNlX2Rlc2Nfb2ZmZW5zZV8zLjMsIG9mZmVuc2VfZGVzY3JpcHRpb25fb2ZmZW5zZV8zLjQsIHJlZHVjZWRfb2ZmZW5zZV9kZXNjX29mZmVuc2VfMy40LG9mZmVuc2VfZGVzY3JpcHRpb25fb2ZmZW5zZV80LjAsIHJlZHVjZWRfb2ZmZW5zZV9kZXNjX29mZmVuc2VfNC4wLCBvZmZlbnNlX2Rlc2NyaXB0aW9uX29mZmVuc2VfNC4xLCByZWR1Y2VkX29mZmVuc2VfZGVzY19vZmZlbnNlXzQuMSxvZmZlbnNlX2Rlc2NyaXB0aW9uX29mZmVuc2VfNC4yLCByZWR1Y2VkX29mZmVuc2VfZGVzY19vZmZlbnNlXzQuMiwgb2ZmZW5zZV9kZXNjcmlwdGlvbl9vZmZlbnNlXzUuMCwgcmVkdWNlZF9vZmZlbnNlX2Rlc2Nfb2ZmZW5zZV81LjAsIG9mZmVuc2VfZGVzY3JpcHRpb25fb2ZmZW5zZV82LjAsIHJlZHVjZWRfb2ZmZW5zZV9kZXNjX29mZmVuc2VfNi4wLCBvZmZlbnNlX2Rlc2NyaXB0aW9uX29mZmVuc2VfNy4wLCByZWR1Y2VkX29mZmVuc2VfZGVzY19vZmZlbnNlXzcuMCkpIAogICAgICAgICB8IGdyZXBsKCIyMjk5OTkiLCBwYXN0ZShvZmZlbnNlX2Rlc2NyaXB0aW9uX29mZmVuc2VfMS4wLCByZWR1Y2VkX29mZmVuc2VfZGVzY19vZmZlbnNlXzEuMCwgb2ZmZW5zZV9kZXNjcmlwdGlvbl9vZmZlbnNlXzEuMSwgcmVkdWNlZF9vZmZlbnNlX2Rlc2Nfb2ZmZW5zZV8xLjEsICBvZmZlbnNlX2Rlc2NyaXB0aW9uX29mZmVuc2VfMS4yLCByZWR1Y2VkX29mZmVuc2VfZGVzY19vZmZlbnNlXzEuMiwgb2ZmZW5zZV9kZXNjcmlwdGlvbl9vZmZlbnNlXzEuMywgcmVkdWNlZF9vZmZlbnNlX2Rlc2Nfb2ZmZW5zZV8xLjMsIG9mZmVuc2VfZGVzY3JpcHRpb25fb2ZmZW5zZV8xLjQsIHJlZHVjZWRfb2ZmZW5zZV9kZXNjX29mZmVuc2VfMS40LCBvZmZlbnNlX2Rlc2NyaXB0aW9uX29mZmVuc2VfMS41LCByZWR1Y2VkX29mZmVuc2VfZGVzY19vZmZlbnNlXzEuNSwgb2ZmZW5zZV9kZXNjcmlwdGlvbl9vZmZlbnNlXzIuMCwgcmVkdWNlZF9vZmZlbnNlX2Rlc2Nfb2ZmZW5zZV8yLjAsIG9mZmVuc2VfZGVzY3JpcHRpb25fb2ZmZW5zZV8yLjEsIHJlZHVjZWRfb2ZmZW5zZV9kZXNjX29mZmVuc2VfMi4xLCBvZmZlbnNlX2Rlc2NyaXB0aW9uX29mZmVuc2VfMi4yLCByZWR1Y2VkX29mZmVuc2VfZGVzY19vZmZlbnNlXzIuMiwgb2ZmZW5zZV9kZXNjcmlwdGlvbl9vZmZlbnNlXzIuMywgcmVkdWNlZF9vZmZlbnNlX2Rlc2Nfb2ZmZW5zZV8yLjMsIG9mZmVuc2VfZGVzY3JpcHRpb25fb2ZmZW5zZV8zLjAsIHJlZHVjZWRfb2ZmZW5zZV9kZXNjX29mZmVuc2VfMy4wLCBvZmZlbnNlX2Rlc2NyaXB0aW9uX29mZmVuc2VfMy4xLCByZWR1Y2VkX29mZmVuc2VfZGVzY19vZmZlbnNlXzMuMSwgb2ZmZW5zZV9kZXNjcmlwdGlvbl9vZmZlbnNlXzMuMiwgcmVkdWNlZF9vZmZlbnNlX2Rlc2Nfb2ZmZW5zZV8zLjIsIG9mZmVuc2VfZGVzY3JpcHRpb25fb2ZmZW5zZV8zLjMsIHJlZHVjZWRfb2ZmZW5zZV9kZXNjX29mZmVuc2VfMy4zLCBvZmZlbnNlX2Rlc2NyaXB0aW9uX29mZmVuc2VfMy40LCByZWR1Y2VkX29mZmVuc2VfZGVzY19vZmZlbnNlXzMuNCxvZmZlbnNlX2Rlc2NyaXB0aW9uX29mZmVuc2VfNC4wLCByZWR1Y2VkX29mZmVuc2VfZGVzY19vZmZlbnNlXzQuMCwgb2ZmZW5zZV9kZXNjcmlwdGlvbl9vZmZlbnNlXzQuMSwgcmVkdWNlZF9vZmZlbnNlX2Rlc2Nfb2ZmZW5zZV80LjEsb2ZmZW5zZV9kZXNjcmlwdGlvbl9vZmZlbnNlXzQuMiwgcmVkdWNlZF9vZmZlbnNlX2Rlc2Nfb2ZmZW5zZV80LjIsIG9mZmVuc2VfZGVzY3JpcHRpb25fb2ZmZW5zZV81LjAsIHJlZHVjZWRfb2ZmZW5zZV9kZXNjX29mZmVuc2VfNS4wLCBvZmZlbnNlX2Rlc2NyaXB0aW9uX29mZmVuc2VfNi4wLCByZWR1Y2VkX29mZmVuc2VfZGVzY19vZmZlbnNlXzYuMCwgb2ZmZW5zZV9kZXNjcmlwdGlvbl9vZmZlbnNlXzcuMCwgcmVkdWNlZF9vZmZlbnNlX2Rlc2Nfb2ZmZW5zZV83LjApKQogICAgICAgICB8IGdyZXBsKCI0OTk5OTkiLCBwYXN0ZShvZmZlbnNlX2Rlc2NyaXB0aW9uX29mZmVuc2VfMS4wLCByZWR1Y2VkX29mZmVuc2VfZGVzY19vZmZlbnNlXzEuMCwgb2ZmZW5zZV9kZXNjcmlwdGlvbl9vZmZlbnNlXzEuMSwgcmVkdWNlZF9vZmZlbnNlX2Rlc2Nfb2ZmZW5zZV8xLjEsICBvZmZlbnNlX2Rlc2NyaXB0aW9uX29mZmVuc2VfMS4yLCByZWR1Y2VkX29mZmVuc2VfZGVzY19vZmZlbnNlXzEuMiwgb2ZmZW5zZV9kZXNjcmlwdGlvbl9vZmZlbnNlXzEuMywgcmVkdWNlZF9vZmZlbnNlX2Rlc2Nfb2ZmZW5zZV8xLjMsIG9mZmVuc2VfZGVzY3JpcHRpb25fb2ZmZW5zZV8xLjQsIHJlZHVjZWRfb2ZmZW5zZV9kZXNjX29mZmVuc2VfMS40LCBvZmZlbnNlX2Rlc2NyaXB0aW9uX29mZmVuc2VfMS41LCByZWR1Y2VkX29mZmVuc2VfZGVzY19vZmZlbnNlXzEuNSwgb2ZmZW5zZV9kZXNjcmlwdGlvbl9vZmZlbnNlXzIuMCwgcmVkdWNlZF9vZmZlbnNlX2Rlc2Nfb2ZmZW5zZV8yLjAsIG9mZmVuc2VfZGVzY3JpcHRpb25fb2ZmZW5zZV8yLjEsIHJlZHVjZWRfb2ZmZW5zZV9kZXNjX29mZmVuc2VfMi4xLCBvZmZlbnNlX2Rlc2NyaXB0aW9uX29mZmVuc2VfMi4yLCByZWR1Y2VkX29mZmVuc2VfZGVzY19vZmZlbnNlXzIuMiwgb2ZmZW5zZV9kZXNjcmlwdGlvbl9vZmZlbnNlXzIuMywgcmVkdWNlZF9vZmZlbnNlX2Rlc2Nfb2ZmZW5zZV8yLjMsIG9mZmVuc2VfZGVzY3JpcHRpb25fb2ZmZW5zZV8zLjAsIHJlZHVjZWRfb2ZmZW5zZV9kZXNjX29mZmVuc2VfMy4wLCBvZmZlbnNlX2Rlc2NyaXB0aW9uX29mZmVuc2VfMy4xLCByZWR1Y2VkX29mZmVuc2VfZGVzY19vZmZlbnNlXzMuMSwgb2ZmZW5zZV9kZXNjcmlwdGlvbl9vZmZlbnNlXzMuMiwgcmVkdWNlZF9vZmZlbnNlX2Rlc2Nfb2ZmZW5zZV8zLjIsIG9mZmVuc2VfZGVzY3JpcHRpb25fb2ZmZW5zZV8zLjMsIHJlZHVjZWRfb2ZmZW5zZV9kZXNjX29mZmVuc2VfMy4zLCBvZmZlbnNlX2Rlc2NyaXB0aW9uX29mZmVuc2VfMy40LCByZWR1Y2VkX29mZmVuc2VfZGVzY19vZmZlbnNlXzMuNCxvZmZlbnNlX2Rlc2NyaXB0aW9uX29mZmVuc2VfNC4wLCByZWR1Y2VkX29mZmVuc2VfZGVzY19vZmZlbnNlXzQuMCwgb2ZmZW5zZV9kZXNjcmlwdGlvbl9vZmZlbnNlXzQuMSwgcmVkdWNlZF9vZmZlbnNlX2Rlc2Nfb2ZmZW5zZV80LjEsb2ZmZW5zZV9kZXNjcmlwdGlvbl9vZmZlbnNlXzQuMiwgcmVkdWNlZF9vZmZlbnNlX2Rlc2Nfb2ZmZW5zZV80LjIsIG9mZmVuc2VfZGVzY3JpcHRpb25fb2ZmZW5zZV81LjAsIHJlZHVjZWRfb2ZmZW5zZV9kZXNjX29mZmVuc2VfNS4wLCBvZmZlbnNlX2Rlc2NyaXB0aW9uX29mZmVuc2VfNi4wLCByZWR1Y2VkX29mZmVuc2VfZGVzY19vZmZlbnNlXzYuMCwgb2ZmZW5zZV9kZXNjcmlwdGlvbl9vZmZlbnNlXzcuMCwgcmVkdWNlZF9vZmZlbnNlX2Rlc2Nfb2ZmZW5zZV83LjApKSAKICAgICAgICAgfCBncmVwbCgiOTA5MDEiLCBwYXN0ZShvZmZlbnNlX2Rlc2NyaXB0aW9uX29mZmVuc2VfMS4wLCByZWR1Y2VkX29mZmVuc2VfZGVzY19vZmZlbnNlXzEuMCwgb2ZmZW5zZV9kZXNjcmlwdGlvbl9vZmZlbnNlXzEuMSwgcmVkdWNlZF9vZmZlbnNlX2Rlc2Nfb2ZmZW5zZV8xLjEsICBvZmZlbnNlX2Rlc2NyaXB0aW9uX29mZmVuc2VfMS4yLCByZWR1Y2VkX29mZmVuc2VfZGVzY19vZmZlbnNlXzEuMiwgb2ZmZW5zZV9kZXNjcmlwdGlvbl9vZmZlbnNlXzEuMywgcmVkdWNlZF9vZmZlbnNlX2Rlc2Nfb2ZmZW5zZV8xLjMsIG9mZmVuc2VfZGVzY3JpcHRpb25fb2ZmZW5zZV8xLjQsIHJlZHVjZWRfb2ZmZW5zZV9kZXNjX29mZmVuc2VfMS40LCBvZmZlbnNlX2Rlc2NyaXB0aW9uX29mZmVuc2VfMS41LCByZWR1Y2VkX29mZmVuc2VfZGVzY19vZmZlbnNlXzEuNSwgb2ZmZW5zZV9kZXNjcmlwdGlvbl9vZmZlbnNlXzIuMCwgcmVkdWNlZF9vZmZlbnNlX2Rlc2Nfb2ZmZW5zZV8yLjAsIG9mZmVuc2VfZGVzY3JpcHRpb25fb2ZmZW5zZV8yLjEsIHJlZHVjZWRfb2ZmZW5zZV9kZXNjX29mZmVuc2VfMi4xLCBvZmZlbnNlX2Rlc2NyaXB0aW9uX29mZmVuc2VfMi4yLCByZWR1Y2VkX29mZmVuc2VfZGVzY19vZmZlbnNlXzIuMiwgb2ZmZW5zZV9kZXNjcmlwdGlvbl9vZmZlbnNlXzIuMywgcmVkdWNlZF9vZmZlbnNlX2Rlc2Nfb2ZmZW5zZV8yLjMsIG9mZmVuc2VfZGVzY3JpcHRpb25fb2ZmZW5zZV8zLjAsIHJlZHVjZWRfb2ZmZW5zZV9kZXNjX29mZmVuc2VfMy4wLCBvZmZlbnNlX2Rlc2NyaXB0aW9uX29mZmVuc2VfMy4xLCByZWR1Y2VkX29mZmVuc2VfZGVzY19vZmZlbnNlXzMuMSwgb2ZmZW5zZV9kZXNjcmlwdGlvbl9vZmZlbnNlXzMuMiwgcmVkdWNlZF9vZmZlbnNlX2Rlc2Nfb2ZmZW5zZV8zLjIsIG9mZmVuc2VfZGVzY3JpcHRpb25fb2ZmZW5zZV8zLjMsIHJlZHVjZWRfb2ZmZW5zZV9kZXNjX29mZmVuc2VfMy4zLCBvZmZlbnNlX2Rlc2NyaXB0aW9uX29mZmVuc2VfMy40LCByZWR1Y2VkX29mZmVuc2VfZGVzY19vZmZlbnNlXzMuNCxvZmZlbnNlX2Rlc2NyaXB0aW9uX29mZmVuc2VfNC4wLCByZWR1Y2VkX29mZmVuc2VfZGVzY19vZmZlbnNlXzQuMCwgb2ZmZW5zZV9kZXNjcmlwdGlvbl9vZmZlbnNlXzQuMSwgcmVkdWNlZF9vZmZlbnNlX2Rlc2Nfb2ZmZW5zZV80LjEsb2ZmZW5zZV9kZXNjcmlwdGlvbl9vZmZlbnNlXzQuMiwgcmVkdWNlZF9vZmZlbnNlX2Rlc2Nfb2ZmZW5zZV80LjIsIG9mZmVuc2VfZGVzY3JpcHRpb25fb2ZmZW5zZV81LjAsIHJlZHVjZWRfb2ZmZW5zZV9kZXNjX29mZmVuc2VfNS4wLCBvZmZlbnNlX2Rlc2NyaXB0aW9uX29mZmVuc2VfNi4wLCByZWR1Y2VkX29mZmVuc2VfZGVzY19vZmZlbnNlXzYuMCwgb2ZmZW5zZV9kZXNjcmlwdGlvbl9vZmZlbnNlXzcuMCwgcmVkdWNlZF9vZmZlbnNlX2Rlc2Nfb2ZmZW5zZV83LjApKSAKICAgICAgICAgfCBncmVwbCgiOTA5MDIiLCBwYXN0ZShvZmZlbnNlX2Rlc2NyaXB0aW9uX29mZmVuc2VfMS4wLCByZWR1Y2VkX29mZmVuc2VfZGVzY19vZmZlbnNlXzEuMCwgb2ZmZW5zZV9kZXNjcmlwdGlvbl9vZmZlbnNlXzEuMSwgcmVkdWNlZF9vZmZlbnNlX2Rlc2Nfb2ZmZW5zZV8xLjEsICBvZmZlbnNlX2Rlc2NyaXB0aW9uX29mZmVuc2VfMS4yLCByZWR1Y2VkX29mZmVuc2VfZGVzY19vZmZlbnNlXzEuMiwgb2ZmZW5zZV9kZXNjcmlwdGlvbl9vZmZlbnNlXzEuMywgcmVkdWNlZF9vZmZlbnNlX2Rlc2Nfb2ZmZW5zZV8xLjMsIG9mZmVuc2VfZGVzY3JpcHRpb25fb2ZmZW5zZV8xLjQsIHJlZHVjZWRfb2ZmZW5zZV9kZXNjX29mZmVuc2VfMS40LCBvZmZlbnNlX2Rlc2NyaXB0aW9uX29mZmVuc2VfMS41LCByZWR1Y2VkX29mZmVuc2VfZGVzY19vZmZlbnNlXzEuNSwgb2ZmZW5zZV9kZXNjcmlwdGlvbl9vZmZlbnNlXzIuMCwgcmVkdWNlZF9vZmZlbnNlX2Rlc2Nfb2ZmZW5zZV8yLjAsIG9mZmVuc2VfZGVzY3JpcHRpb25fb2ZmZW5zZV8yLjEsIHJlZHVjZWRfb2ZmZW5zZV9kZXNjX29mZmVuc2VfMi4xLCBvZmZlbnNlX2Rlc2NyaXB0aW9uX29mZmVuc2VfMi4yLCByZWR1Y2VkX29mZmVuc2VfZGVzY19vZmZlbnNlXzIuMiwgb2ZmZW5zZV9kZXNjcmlwdGlvbl9vZmZlbnNlXzIuMywgcmVkdWNlZF9vZmZlbnNlX2Rlc2Nfb2ZmZW5zZV8yLjMsIG9mZmVuc2VfZGVzY3JpcHRpb25fb2ZmZW5zZV8zLjAsIHJlZHVjZWRfb2ZmZW5zZV9kZXNjX29mZmVuc2VfMy4wLCBvZmZlbnNlX2Rlc2NyaXB0aW9uX29mZmVuc2VfMy4xLCByZWR1Y2VkX29mZmVuc2VfZGVzY19vZmZlbnNlXzMuMSwgb2ZmZW5zZV9kZXNjcmlwdGlvbl9vZmZlbnNlXzMuMiwgcmVkdWNlZF9vZmZlbnNlX2Rlc2Nfb2ZmZW5zZV8zLjIsIG9mZmVuc2VfZGVzY3JpcHRpb25fb2ZmZW5zZV8zLjMsIHJlZHVjZWRfb2ZmZW5zZV9kZXNjX29mZmVuc2VfMy4zLCBvZmZlbnNlX2Rlc2NyaXB0aW9uX29mZmVuc2VfMy40LCByZWR1Y2VkX29mZmVuc2VfZGVzY19vZmZlbnNlXzMuNCxvZmZlbnNlX2Rlc2NyaXB0aW9uX29mZmVuc2VfNC4wLCByZWR1Y2VkX29mZmVuc2VfZGVzY19vZmZlbnNlXzQuMCwgb2ZmZW5zZV9kZXNjcmlwdGlvbl9vZmZlbnNlXzQuMSwgcmVkdWNlZF9vZmZlbnNlX2Rlc2Nfb2ZmZW5zZV80LjEsb2ZmZW5zZV9kZXNjcmlwdGlvbl9vZmZlbnNlXzQuMiwgcmVkdWNlZF9vZmZlbnNlX2Rlc2Nfb2ZmZW5zZV80LjIsIG9mZmVuc2VfZGVzY3JpcHRpb25fb2ZmZW5zZV81LjAsIHJlZHVjZWRfb2ZmZW5zZV9kZXNjX29mZmVuc2VfNS4wLCBvZmZlbnNlX2Rlc2NyaXB0aW9uX29mZmVuc2VfNi4wLCByZWR1Y2VkX29mZmVuc2VfZGVzY19vZmZlbnNlXzYuMCwgb2ZmZW5zZV9kZXNjcmlwdGlvbl9vZmZlbnNlXzcuMCwgcmVkdWNlZF9vZmZlbnNlX2Rlc2Nfb2ZmZW5zZV83LjApKSkgIAoKZW1pbGllX3B1bGwKICAKYGBgCgo1NDA0MTIgLS0gRHJpdmluZyBXaGlsZSBJbnRveGljYXRlZCAtM0QvTSA1NDA0MDUgLS0gRHJpdmluZyBXaGlsZQpJbnRveGljYXRlZCAzcmQgNTQwNDE4IC0tIERXSSB3LyBwcmV2IGludG94IG1hbnNsIGNvbnZpY3QgMjI5OTk5IC0tIERXSQpTdWJzZXF1ZW50IE9mZmVuc2UgNDk5OTk5IC0tIERXSSAtLSAzcmQgQWNjaWRlbnQgOTA5MDEgLS0gSW50b3hpY2F0aW9uCk1hbnNsYXVnaHRlciA5MDkwMiAtLSBJbnRveCBNYW5zbGF1Z2h0ZXIgUHVibCBTZXJ2CgpgYGB7cn0KZW1pbGllX3B1bGxfZWFjaF9vZmZlbnNlIDwtIGNsZWFuX2R3aSAlPiUKICBmaWx0ZXIob2ZmZW5zZV9jb2RlID09ICI1NDA0MTIiIHwgb2ZmZW5zZV9jb2RlID09ICI1NDA0MDUiIHwgb2ZmZW5zZV9jb2RlID09ICI1NDA0MTgiIHwgb2ZmZW5zZV9jb2RlID09ICIyMjk5OTkiIHwgb2ZmZW5zZV9jb2RlID09ICI0OTk5OTkiIHwgb2ZmZW5zZV9jb2RlID09ICI5MDkwMSIgfCBvZmZlbnNlX2NvZGUgPT0gIjkwOTAyIiB8IHJlZHVjZWRfb2ZmZW5zZV9jb2RlID09ICI1NDA0MTIiIHwgcmVkdWNlZF9vZmZlbnNlX2NvZGUgPT0gIjU0MDQwNSIgfCByZWR1Y2VkX29mZmVuc2VfY29kZSA9PSAiNTQwNDE4IiB8IHJlZHVjZWRfb2ZmZW5zZV9jb2RlID09ICIyMjk5OTkiIHwgcmVkdWNlZF9vZmZlbnNlX2NvZGUgPT0gIjQ5OTk5OSIgfCByZWR1Y2VkX29mZmVuc2VfY29kZSA9PSAiOTA5MDEiIHxyZWR1Y2VkX29mZmVuc2VfY29kZSA9PSAiOTA5MDIiKSAlPiUKICBsZWZ0X2pvaW4oaW5kaXZpZHVhbCwgYnkgPSAic2lkIikgJT4lCiAgcmVuYW1lKG51bWJlcl9vZl9kd2lfcmVsYXRlZF9vZmZlbnNlcyA9IG4pICU+JQogIHNlbGVjdChzaWQsIGZ1bGxfbmFtZSwgc2V4LCByYWNlLCBiaXJ0aGRhdGUsIG51bWJlcl9vZl9kd2lfcmVsYXRlZF9vZmZlbnNlcywgZXZlcnl0aGluZygpKQoKZW1pbGllX3B1bGxfZWFjaF9vZmZlbnNlCmBgYAoKYGBge3J9CiN3cml0ZV9jc3YoZW1pbGllX3B1bGwsICJteV9leHBvcnRzL0FwcmlsMTcvZW1pbGllX3B1bGwuY3N2IikKI3dyaXRlX2NzdihlbWlsaWVfcHVsbF9lYWNoX29mZmVuc2UsICJEYXRhL215X2V4cG9ydHMvTWF5MTMvbWF5MTFfZW1pbGllcHVsbF9ieV9vZmZlbnNlLmNzdiIpCmBgYAoK